2014-09-10 55 views
3

是否有可能在同一個實體上映射到同一列(使用基本JPA或使用休眠)同步兩個屬性?休眠 - 同步映射同一列的兩個屬性

我有兩個特性:

@JoinColumn(referencedColumnName = "id", insertable = false, name = "parent", updatable = false) 
@ManyToOne(fetch = FetchType.LAZY) 
private Person parent; 
@Column(name = "parent") 
private Integer parentId; 

基本上,我想以下幾點:

System.out.println(element.getParentId()); 
System.out.println(element.getParent().getId()); 
element.setParentId(2); 
System.out.println(element.getParentId()); 
System.out.println(element.getParent().getId()); 

打印本 「3,3,2,2」,而不是「3,3, 2,3" 。

是否有可能(沒有在使用getParent編寫自定義的延遲加載()的getter?)

THX提前

+0

當我使用這種映射配置時,Hibernate總是會出現「實體映射中的重複列」的錯誤,但是我使用的是可更新/可插入的。這應該不夠嗎? – ffleandro 2015-04-02 18:12:25

回答

2

IIRC,Hibernate不會爲你做的。如果你有這樣的事情,你就是一個負責任的人(我記得做過類似的事情)。

第一種解決方案將首先保存實體,然後使用實體管理器進行刷新。

element.setParentId(2); 
entityManager.merge(element); 
entityManager.refresh(element); 

刷新將使它從數據庫中再次獲取對象,並且它將具有正確的值。

我做的第二個選擇是更改實體的setter以維護狀態。喜歡的東西:

public void setParent(Parent parent) { 
    this.parent = parent; 
    parentId = parent.id; 
} 
+0

Thx作爲答案。太糟糕了,沒有任何'自動'的解決方案... 好吧,也許Hibernate的範圍不是內存實體管理 – SzaboAdam 2014-09-11 05:52:53

0

試試這個

@JoinColumn(referencedColumnName = "id", insertable = false, name = "parent") 
@ManyToOne(fetch = FetchType.LAZY) 
private Person parent; 


@Column(name = "parent") 
private Integer parentId; 

如果不工作:

如果parentId是父實體的主鍵,請嘗試此操作:

@JoinColumn(referencedColumnName = "id", insertable = false, name = "parent") 
@ManyToOne(fetch = FetchType.LAZY) 
private Person parent; 

@Id 
@GeneratedValue(strategy = GenerateType.AUTO) 
@Column(name = "parent") 
private Integer parentId; 

試試這個:

@JoinColumn(referencedColumnName = "id", name = "parent") 
@ManyToOne(fetch = FetchType.LAZY) 
private Person parent; 


@Column(name = "parent") 
private Integer parentId; 

如果不工作:

試試這個:

@JoinColumn(name = "parent") 
@ManyToOne(fetch = FetchType.LAZY) 
private Person parent; 


@Column(name = "parent") 
private Integer parentId; 
+0

如果我省略「可更新」部分(就我所知,第一個解決方案的變化就是這樣)--Hibernate失敗,因爲它無法處理同一列上的兩個可更新屬性。這同樣適用於其他的 - 沒有「可插入的」或「可更新的」屬性參數,Hibernate無法自行初始化 – SzaboAdam 2014-09-11 05:58:13

0

您可以有兩個屬性,像這樣同一列:

@JoinColumn(name = "CGRADO_CODIGO", referencedColumnName = "CGRADO_CODIGO") 
    @ManyToOne 
    @NotFound(action=NotFoundAction.IGNORE) 
    private SipreGrado     sipreGrado; 

    @Column(name = "CGRADO_CODIGO",insertable=false,updatable=false) 
    private String      sipreGradoCodigo; 

你在檢查代碼輸出將是這樣的:

sipreGradoCodigo "001" 
sipreGrado   null 

sipreGradoCodigo "001" 
sipreGrado   Entity SipreGrado ["001","other property","etc"] 

請記住if你有時具有實體NULL您可以與註釋

@NotFound(action=NotFoundAction.IGNORE) 

而且跳過它,記得設置

insertable=false,updatable=false 

爲您不想在插入/更新查詢包括一個。