2011-03-10 25 views
6

hibernate optional join冬眠可選加入 - 需要返回聯接列值無論哪種方式

許多現有的查詢系統中的一個遵循依靠有被EntityOne和EntityTwo之間的映射關係和不斷變化的,這不是一個attactive選項,但是現在我需要開始存儲和檢索tbl_one.two_id中不存在於連接表中的值。在路上,這正常工作與以下映射:

@Entity 
@Table(name="tbl_one") 
public class EntityOne 
{ 
    .... 
    @ManyToOne 
    @NotFound(action = NotFoundAction.IGNORE) 
    @JoinColumn(name = "two_id") 
    private EntityTwo two; 
    .... 
} 

。但是查詢的時候,如果結果有two_id不中連接表的字段存在,該值的值two是空,我無法告訴tbl_one.two_id的實際價值。我希望hibernate會創建一個虛擬的EntityTwo對象,並且只有在關係不存在時才填充它的id字段。

我還試圖映射two_id另一場沒有加入:

@Entity 
@Table(name="tbl_one") 
public class EntityOne 
{ 
    .... 
    @ManyToOne 
    @NotFound(action = NotFoundAction.IGNORE) 
    @JoinColumn(name = "two_id", insertable = false, updatable = false) 
    private EntityTwo two; 

    @Column(name = "two_id") 
    private String twoId; 
    .... 
} 

...但隨後的two場從未填充,即使相應的記錄存在。

基本上我需要插入/爲tbl_one.two_id來更新值和檢索加盟實體EntityTwo的一些方式,如果存在這種關係,或者僅僅是爲了tbl_one.two_id的值,如果不存在關聯關係。

我希望能夠解決這個問題,而無需爲同一張表創建兩個映射。

謝謝。

編輯:更多信息

public class EntityTwo 
{ 
    ... 
    @Id 
    @Column(name = "site_id") 
    private String id; 
    ... 
} 

回答

4

這應該工作:

@ManyToOne 
@NotFound(action = NotFoundAction.IGNORE) 
@JoinColumn(name = "two_id", insertable = false, updatable = false) 
private EntityTwo two; 

@Formula("two_id") 
private String twoId; 

Hibernate會選擇兩次two_id列:第一次填充這兩個關係,一旦填充twoId。儘管如此,twoId屬性是隻讀的。

你也可以反過來做,但後來它的兩個屬性,這將成爲只讀:

@ManyToOne 
@NotFound(action = NotFoundAction.IGNORE) 
@JoinFormula("two_id") 
private EntityTwo two; 

@Column("two_id") 
private String twoId; 
+0

與JoinFormula如我得到'org.postgresql.util.PSQLException:ERROR:列當查詢...時,this_.two_two_id不存在?我猜'價值'「two_id」應該是別的,但我無法找到網上的例子..你能幫助嗎? – pstanton 2011-03-10 09:47:00

+0

確實沒有JoinFormula的文檔:( – pstanton 2011-03-10 10:05:16

+0

文檔確實非常輕,請試試@JoinFormula(value =「two_id」,referencedColumnName =「two_id」)並查看生成的SQL以查看要放置爲屬性值的內容。另外,請查看http://opensource.atlassian.com/projects/hibernate/browse/HHH-5041和http://opensource.atlassian.com/projects/hibernate/browse/HHH-5171瞭解它如何工作的指標 – 2011-03-10 10:08:13