2015-08-10 3 views
0

У меня есть таблица «AnyEntityReference», которая ссылается на другие объекты по двум полям: тип «ссылочный объект» (т.е. «Entity1», «Entity2», ...) и объект «ключ»:Спящий режим: @ManyToOne по пользовательскому запросу

create table AnyEntityReference (
    type  varchar, /* 'Entity1' or 'Entity2' or 'Entity3' */ 
    key  varchar /* if type = 'Entity1' then key to 'Entity1' table etc. */ 
) 

create table Entity1 (
    key  varchar, 
    ... 
) 

create table Entity2 (
    key  varchar, 
    ... 
) 

create table Entity3 (
    key  varchar, 
    ... 
) 
... 

Мне нужно увидеть эти поля в ряде деклараций @ManyToOne, как это:

@ManyToOne 
@JoinColumn(name = "key", insertable=false, updatable=false) 
@NotFound(action = NotFoundAction.IGNORE) 
private Entity1 entity1; 

@ManyToOne 
@JoinColumn(name = "key", insertable=false, updatable=false) 
@NotFound(action = NotFoundAction.IGNORE) 
private Entity2 entity2; 

@ManyToOne 
@JoinColumn(name = "key", insertable=false, updatable=false) 
@NotFound(action = NotFoundAction.IGNORE) 
private Entity3 entity3; 
... 

Что здесь отсутствует какая-то дополнительный фильтр, который позволяет Hibernate инициализировать только одно поле с совпадающим «типом».

Я думаю, что могу использовать аннотации @Where или @Filter, но я не знаю, как передать поле типа из ссылочного «владельца».

Кроме того, я хотел бы, чтобы это было реализовано таким образом, поэтому эти поля в «AnyEntityReference» могут ссылаться на «mappedBy» в отношениях @OneToMany.

ответ

1

Я изменил ваш код: попробуйте под кодом, который может исправить возникшую проблему, , если вы хотите получить правильное решение, а затем укажите структуру таблицы.

@ManyToOne 
@JoinColumn(name = "KEY", insertable=false, updatable=false) 
@NotFound(action = NotFoundAction.IGNORE) 
private User user; 


@JsonIgnore 
@OneToMany(mappedBy="user") 
private Set<Organization> Organization; 

код для: одной организации имеет несколько пользователей по отношению к таблице.

+0

Я не понимаю ваших исправлений. Во-первых, в моем случае «Пользователь» и «Организация» являются просто примерами сущностей. Они не связаны. – Vladimir

0

@JoinFormula работает почти хорошо:

@ManyToOne(fetch=FetchType.LAZY) 
@JoinFormula(value="(SELECT u.key FROM Entity1 u WHERE type = 'Entity1' and u.key = key)", 
    referencedColumnName="key") 
@NotFound(action = NotFoundAction.IGNORE) 
private @Nullable Entity1 entity1; 

Единственная небольшая проблема это то, что Hibernate не поддерживает (сбои) при попытке использования этих полей, как «mappedBy» в отношениях @OneToMany.

0

Как название книги «Думая на Java», я считаю, что лучшим решением для вашей проблемы является полиморфизм. что-то вроде этого:

@Entity 
    @Table("AnyEntityReference") 
    public class AnyEntityReference { 
     ... 
     @JoinColumn(name = "key", insertable=false, updatable=false) 
     @NotFound(action = NotFoundAction.IGNORE) 
     private Entity entity; 
     ... 
    } 

    // Base class 
    @Entity 
    @Inheritance(strategy=SINGLE_TABLE) 
    public class Entity { 
     ... 
     @Id 
     private String key; 
     ... 
    } 

    //Child Classes 
    @Entity 
    public class EntityType1 extends Entity { 
     ... 
    } 

    @Entity 
    public class EntityType2 extends Entity { 
     ... 
    } 

    @Entity 
    public class EntityType3 extends Entity { 
     ... 
    } 

Таким образом, у вас есть только ссылка на объект (базовый класс), и вы можете использовать полиморфизм для обработки каждого объекта.

Сообщаю вам несколько ссылок об этом.

https://docs.oracle.com/html/E13981_01/cmp30cfg016.htm https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/inheritance.html

Я надеюсь, что эта информация поможет вам.

Удачи.

+0

Спасибо, Гектор. Я вижу эту идею. К сожалению, в моем случае это не сработает. Я имею дело с устаревшей БД, все ключевые столбцы в сущностях называются после их соответствующих таблиц, поэтому я не могу объявить их в базовом классе с единственным символом @Id. – Vladimir

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