2013-11-22 26 views
3

我在Hibernate/J2EE中的Lazy Initialization有問題。我有一個Object Cat,它包含一個包含字符串地址的Object Collar。衣領和地址處於延遲加載狀態。在休眠狀態下將重新加載的對象鏈接到其父級

我正在從我的數據庫加載我的對象貓(所以我的會話被關閉)。 我的貓包含我的衣領,但我可以訪問我的地址(延遲加載異常)。

所以我的想法是重新加載衣領得到地址。它的作品,我做這樣的事情:

Cat cat = animals.loadCat(id); 
//Here, cat contains collar, but collar doesn't contains address 
Collar collar = animals.reload(collar); 
//Here my collar does contain my address 
collar.setAddress("new address"); 

如果我做了

animals.update(cat); //(a method who call merge) 

它不更新的地址,至極似乎順理成章。

如果我做了

update(collar); 
//Method update 
public void update(Collar collar){ 
    em.merge(collar); 
} 

它的工作原理和我的衣領和貓在基地進行更新。

public class Cat { 
    @ManyToOne 
    private Collar collar; 
    ... 
} 
public class Collar { 
    @OneToMany(cascade = {CascadeType.ALL}) 
    protected String address; 
    ... 
} 
public Collar reload(Collar collar){ 
    return em.find(Collar.class, collar.getId()); 
} 

我的問題是,如何將我的新領鏈接到我的貓,* animals.update(CAT)`後做什麼?

+1

嗨,你可以顯示你的update()方法嗎? –

+1

可能您沒有設置Cascade選項。 – mvb13

+2

在加載之後和更新之前,你做過'cat.setCollar(collar)'或'collar.setCat(cat)'嗎?擁有哪一方? 'update()'做了什麼? – Thomas

回答

1

解決方案:

Cat cat = animals.loadCat(id); 
Collar collar = animals.reload(collar); 
cat.setCollar(collar); 
collar.setAddress("new address"); 
animals.update(cat); 

我不知道這是不是最好的,但它的工作原理,似乎邏輯。 感謝所有

1

做這樣的事情:通過@Thomas給出

Cat cat = animals.loadCat(id); 
    cat.getCollar().setAddress("new address"); 
    animals.update(cat); 
+0

在這種情況下,我對.setAddress(「新地址」)有個例外:無法懶惰地初始化角色com.project.animals.Collar.address的集合,沒有會話或會話被關閉 –

+0

您能否顯示您的錯誤消息和你的getCollar(),setAddress()請嗎?衣領不是空? –

+0

animals.reload(collar); 它是做什麼的? –