#java #hibernate #orm
#java #спящий режим #orm
Вопрос:
Пожалуйста, позвольте мне просто показать код,
@Entity
class R {
@Id
Long id;
String selector;
long fkey;
// other columns...
}
@Entity
class Foo {
@Id
Long id;
// select * from R where selector='A' and fkey=Foo_id
@OneToMany
Set<R> aSet;
// select * from R where selector='B' and fkey=Foo_id
@OneToMany
Set<R> bSet;
}
Здесь я не могу разделить R
на две таблицы: R_A
и R_B
, потому что селектор является variant .
Я знаю, что могу создать view R_A и R_B, но я не знаю, как позволить Hibernate генерировать DDL для представлений. Или, может быть, мне следует указать пользовательский SQL-запрос в аннотациях объектов? Нравится,
@Entity
@SourceSQL("select * from R where selector='A')
class R_A { ... }
или, может быть, что-то вроде этого,
@Entity
class Foo {
@Id
Long id;
@OneToMany
@RestrictJoin("selector = 'A'")
Set<R> aSet;
@OneToMany
@RestrictJoin("selector = 'B'")
Set<R> bSet;
}
Что ж, заранее спасибо.
Ответ №1:
Одним из вариантов является аннотация @Filter, взгляните на: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-filters. Вот хороший пример того, как их использовать: http://java.dzone.com/articles/introduction-hibernate-filters.
Фильтру не обязательно иметь параметр, посмотрите этот другой пример: https://forum.hibernate.org/viewtopic.php?f=1amp;t=996694amp;start=0.
Обратите внимание, что вам нужно включать фильтр для каждого сеанса, вы могли бы использовать фильтр для этого: http://forum.springsource.org/showthread.php?t=61464.
Если вы решите использовать один класс для каждого селектора, возможно, вам захочется рассмотреть наследование и аннотацию @DiscriminatorColumn, например: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1168
Ответ №2:
Если вы хотите сохранить коллекцию материалов из другой таблицы, может быть, что-то вроде этого может быть полезно?
@org.hibernate.annotations.CollectionOfElements
@JoinTable (name = "R_A", joinColumns = @JoinColumn(name="ra_id", referencedColumnName="id"))
@org.hibernate.annotations.MapKey (columns = @Column(table = "R_A", name = "key_content"))
@Column(table = "R_A", name = "value_content")
private Map<String, String> raData = new HashMap<String, String>();