2015-01-30 2 views
0

Ниже приведена упрощенная версия схемы для описания реальной проблемы.Борьба за описание отношений JPA или Hibernate с помощью аннотаций

Рассмотрите следующие три класса. MetaDataInfo хранит текущие версии о различных таблицах метаданных. Столбец «isCurrent» указывает на текущую версию.

@Entity 
class MetaDataInfo 
{ 
    @Column 
    int version; 
    @Column 
    String type; 
    @Column 
    boolean isCurrent; 
} 

@Entity 
VersionedInfo { 
    @Column 
    int version; 
} 

@Entity 
Data { 

    VersionedInfo info; 
} 

Можно ли задать спящий режим с помощью аннотаций автоматического обеспечения VersionedInfo из таблицы данных, когда данные считываются из базы данных - как это делает для других отношений. С SQL точки зрения запрос будет выглядеть следующим образом

select * from VersionedInfo where version = (select version from MetaDataInfo where isCurrent = true and type = "VersionedInfo") 
+0

Как насчет аннотировать о версиях, а? Также я не понимаю, что вы пытаетесь сделать здесь. Похоже, вы злоупотребляете Hibernate здесь. Для меня это похоже на то, что эти классы MetaData и Version являются общими абстрактными классами. – Vaelyr

+0

Вы можете использовать [Hibernate filters] (http://www.mkyong.com/hibernate/hibernate-data-filter-example-xml-and-annotation/), чтобы достичь этой функциональности, создать фильтр с вашим местом и активировать это перед запросами. (Это не соответствует JPA) –

+0

@Vaelyr - Не понял ваш вопрос. Если вы запрашиваете аннотацию записи Data.info, это мой вопрос. Какую аннотацию я должен использовать здесь. Я хочу перейти к объекту, у которого есть конкретное предложение where и его не прямые отношения, поскольку текущая версия исходит из другой таблицы. – user871199

ответ

0

Вы можете использовать Hibernate filters для достижения этой функции, создать фильтр с вашим где и активировать его перед запросами. (Это не JPA совместимый)

Как это:

@Entity 
class MetaDataInfo 
{ 
    @Column 
    int version; 
    @Column 
    String type; 
    @Column 
    boolean isCurrent; 
} 

@Entity 
@FilterDef(name="lastInfo") 
VersionedInfo { 
    @Column 
    @Filter(name="lastInfo", condition="(version = (select version from MetaDataInfo where isCurrent = true and type = \"VersionedInfo\")" 
    int version; 
} 

@Entity 
Data { 

    VersionedInfo info; 
} 

И использование:

session.enableFilter("lastInfo") 
// queries 
session.disableFilter("lastInfo") 
Смежные вопросы