Hibernate: Как сопоставить разные селектор в R (селектор, ключ, *) для разных полей? - PullRequest
1 голос
/ 08 апреля 2011

Пожалуйста, позвольте мне просто показать код,

@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, потому что селектор является вариантом.

Я знаю, что могу создавать представления 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;
}

Ну, спасибо заранее.

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

Один из вариантов - аннотация @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=1&t=996694&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

0 голосов
/ 08 апреля 2011

Если вы хотите сохранить коллекцию вещей из другой таблицы, может быть что-то в этом роде может быть полезным?

@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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...