2011-04-08 41 views
1

請讓我只顯示代碼,Hibernate:如何將R(選擇器,鍵,*)中的不同選擇器映射到不同的字段?

@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; 
} 

好了,先謝謝了。

回答

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

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