【问题标题】:Link a reloaded object to its parent in Hibernate在 Hibernate 中将重新加载的对象链接到其父对象
【发布时间】:2013-11-22 10:15:04
【问题描述】:

我在 Hibernate/J2EE 中遇到延迟初始化问题。我有一个对象猫,其中包含一个对象项圈,其中包含一个字符串地址。领和地址处于延迟加载中。

我正在处理我的 Object Cat,它已经从我的数据库中加载(所以我的会话已关闭)。 我的猫确实包含我的项圈,但我可以访问我的地址(延迟加载异常)。

所以我的想法是重新加载 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) 之后做什么?

【问题讨论】:

  • 您好,请问您可以展示一下您的 update() 方法吗?
  • 可能你没有设置级联选项。
  • 您在加载后更新前是否进行了cat.setCollar(collar)collar.setCat(cat)?哪一方是拥有方? update() 是做什么的?
  • 不,我不知道,这可能是解决方案。猫拥有项圈。所以我必须做一个 cat.setCollar(collar)。
  • 是的,我想我们需要看看你的映射。注释或 XML。

标签: java hibernate lazy-loading


【解决方案1】:

做这样的事情:

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

【讨论】:

  • 在这种情况下,我在 .setAddress("new address") 上有一个异常:无法延迟初始化角色 com.project.animals.Collar.address 的集合,没有会话或会话已关闭
  • 你能显示你的错误信息和你的 getCollar() , setAddress() 吗?领子不为空?
  • animals.reload(collar);它有什么作用?
  • 领不为空,但地址为是
  • 地址不能为空,因为:.setAddress("new address");你能显示你的错误吗?
【解决方案2】:

@Thomas 给出的解决方案:

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

我不知道这是否是最好的,但它有效并且看起来合乎逻辑。 谢谢大家

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 2014-01-08
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多