2014-10-13 2 views
1

Скажем, у меня есть таблица товар с колонки с именем user_id и пользовательской таблицы и другой называется суперпользователем:Как определить возможные несуществующие отношения в jpa?

CREATE TABLE Item(id int, user_id int, ..); 
CREATE TABLE User(id int, ..); 
CREATE TABLE Superuser(id int, ..); 

Теперь все детали имеют запись пользователя, но только некоторые из них имеют запись суперпользователя, т.е. Item.user_id == User.id always и Item.user_id == Superuser.id не является обязательным.

Я могу подобрать пользовательскую часть, но у меня нет подсказки, как сопоставить Superuser. Например, это не работает:

@Entity 
public class Item { 
    @ManyToOne(optional = true) 
    @JoinColumn(name = "user_id") 
    private Superuser su; 
    ... 

Это позволяет только user_id быть NULL, но у меня всегда есть user_id.
Мне нужно сообщить jpa, что «даже если будет внешний ключ», может не быть соответствующей записи в таблице суперпользователя.

+0

Начнем с модели базы данных SQL ... Можно ли предположить, что ваша таблица 'Item' содержит два внешних ключа:' user_id int NOT NULL' (всегда) и 'superuser_id int' (необязательно)? – wypieprz

+0

@wypieprz Нет, как определено в псевдо DDL, есть только один внешний ключ в Item, всегда соответствующий первичный ключ в User и необязательная запись в суперпользователе. – estani

+0

звучит скорее как модель должна иметь поле типа «Пользователь» в классе Item, а Superuser расширяет пользователя, и таким образом, если связанный с ним объект является пользователем, тогда он получает пользователя, а если он является суперпользователем, он получает объект суперпользователя. –

ответ

1

Мне удалось разобраться с наиболее специфической проблемой, так как я использую спящий режим в качестве JPA-бэкэнд.
Hibernate имеет NotFound аннотацию именно для этого случая:

По умолчанию, когда Hibernate не может разрешить ассоциацию, поскольку ожидаемый связанный с ним элемент не находится в базе данных (неправильный идентификатор на колонке объединения), исключение поднятый Hibernate. Это может быть неудобно для явных и плохо поддерживаемых схем. Вы можете попросить Hibernate игнорировать такие элементы, а не создавать исключение, используя аннотацию @NotFound. Эта аннотация может использоваться в ассоциации @OneToOne (с FK), @ManyToOne, @OneToMany или @ManyToMany.

Таким образом, решение Hibernate выглядит следующим образом:

@Entity 
public class Item { 
    @ManyToOne(optional = true) 
    @NotFound(action = NotFoundAction.IGNORE) 
    @JoinColumn(name = "user_id") 
    private Superuser su; 
    ... 

Я все еще интересно, если нет другого способа принят спецификации JPA.

Смежные вопросы