Hibernate:如何将R(selector,key,*)中的不同选择器映射到不同的字段?

时间:2011-04-08 03:45:14

标签: java hibernate 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_AR_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 个答案:

答案 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>();