簡體   English   中英

休眠-更改現有對象的屬性

[英]Hibernate - changing attributes of an existing object

考慮以下情況。 我有一個由休眠保持的對象。 該對象具有許多對象屬性,這些屬性本身本身具有大量的屬性。 像這樣:

Mainobject
|-Subobject A
|--String xyz
|-- ...
|-Subobject B
|-- ...
|-Subobject C
|- ...

主對象表幾乎只引用子對象表。

保存和加載對象沒有問題,更改子對象屬性(例如xyz)的值時也不會更新。 但是,有時我必須創建所有子對象的新實例,並將這些新子對象分配給現有的主對象。 當我保存或更新主要對象時,我(顯然)為每個子對象獲得了一個新行,並且主要對象使用新的引用進行了更新。

但是,我要實現的是,Hibernate不會為新對象創建新行,而只是更新舊行。

我該如何實現? (我可以只加載子對象並手動分配其所有新屬性,但是它們太多了,這似乎並不是一個好方法)

謝謝!

編輯:非常基本的示例代碼

Mainobject obj = dao.get(MainObject.class, 1L);
obj.setSubobjectA(new SubobjectA());
obj.setSubobjectB(new SubobjectB());
dao.saveOrUpdate(obj);

另一個編輯:沒有組合鍵。 每個對象/表都有一個PK。 Mainobject表包含對子對象表的引用/外鍵。

編輯(對於用戶226 ..):這是主要對象的外觀:

@Entity
@Table(name="mainobjects")
public class MainObject 
{
    @Id @GeneratedValue
    private Long mainOjectId;

    @OneToOne
    @JoinColumn(name="ref_subobjectA_id")
    @Cascade({CascadeType.SAVE_UPDATE})
    private SubobjectA subobjectA;

    @OneToOne
    @JoinColumn(name="ref_subobjectB_id")
    @Cascade({CascadeType.SAVE_UPDATE})
    private SubobjectB subobjectB;

// getters / setters
}

這是subobjectA的外觀:

@Entity
@Table(name="subobjectsa")
public class SubobjectA 
{
    @Id
    private String subobjectaId;
    private String str1;
    private String str2;
    private String ....
...
// getters/setters
}

SubobjectB看起來幾乎一樣。

在代碼中,我查看對象是否存在:

List<MainObject> existingMainObjects = dao.findByAttributes(MainObject.class, attributeNames, attributeValues);

如果沒有,我只是保存,沒有問題。 如果確實存在,則用另一個主對象的子對象替換現有主對象中的子對象(該對象未持久存儲在數據庫中):

if (existingMainObjects.size() == 1)
{
existingMainObjects.get(0).setSubobjectA (someNewMainObject.getSubobjectA);
existingMainObjects.get(0).setSubobjectB (someNewMainObject.getSubobjectB);

dao.saveOrUpdate(existingMainObjects.get(0));
}

重申一下:這不會為主對象創建任何新條目,但會為子對象創建一個新的條目,並為子對象(因為它與Hibernate保留的對象不同)創建新的條目,並使用新的引用更新主對象。 我想基本實現的是僅替換子對象中的值。

我當前的解決方法包括使用beanutils將所有屬性(但密鑰)從新對象復制到現有對象。 這行得通,但是當您必須執行數萬次時,效率可能很低。

編輯:臨時解決方案確定,我想在MainObject上使用merge而不是saveOrUpdate可以解決問題。 但事實並非如此。 然后,我決定嘗試在每個子對象上單獨使用合並功能。 這似乎出於某種原因起作用。 誰能解釋為什么當我合並主對象時它不起作用?

您正在將兩個新對象設置為MainObject。 現在,當您在外鍵上設置新對象時,由於您說MainObjecct引用了SubobjectA和SubobjectB,因此Hibernate將在主表(即SubobjectA和SubobjectB)中搜索這些對象。 如果找到任何匹配項,那就很好了,否則,它將在那里創建新的實體(分別是SubobjectA和SubobjectB)並插入您的MainOject。

您可以做的是,僅將SubObjectA和SubobjectB中已經存在的那些對象(SubobjectA和SubobjectB)放入MainObject中。 對於新條目,首先插入SubobjectA和SubobjectB,然后插入MainObject。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM