在Hibernate中将重新加载的对象链接到其父对象

时间:2013-11-22 10:15:05

标签: java hibernate lazy-loading

我在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)`?

2 个答案:

答案 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);

我不知道这是否是最好的,但它有效并且看似逻辑。 感谢所有