请让我只显示代码,
@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;
}
嗯,提前谢谢。
答案 0 :(得分: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=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
答案 1 :(得分:0)
如果你想存储一个来自另一个表的东西的集合,那么这可能是有用的吗?
@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>();