我在Hibernate / J2EE中遇到了Lazy Initialization的问题。我有一个Object Cat,它包含一个包含字符串地址的Object Collar。衣领和地址处于延迟加载状态。
我正在使用已从我的数据库加载的Object Cat(因此我的会话已关闭)。 我的Cat确实包含了我的Collar但我可以访问我的地址(延迟加载例外)。
所以我的想法是重新加载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);
}
它有效,我的Collar和Cat在基础上更新。
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)`?
答案 0 :(得分:1)
做类似的事情:
Cat cat = animals.loadCat(id);
cat.getCollar().setAddress("new address");
animals.update(cat);
答案 1 :(得分:1)
@Thomas给出的解决方案:
Cat cat = animals.loadCat(id);
Collar collar = animals.reload(collar);
cat.setCollar(collar);
collar.setAddress("new address");
animals.update(cat);
我不知道这是否是最好的,但它有效并且看似逻辑。 感谢所有