Гибернация: как сопоставить разные селекторы в R (селектор, ключ, *) с разными полями?

#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>();