【问题标题】:Hibernate retrieving dirty object休眠检索脏对象
【发布时间】:2014-11-15 01:59:09
【问题描述】:

我遇到了听起来与对象缓存有关的休眠问题。

解决问题,我有一个实体,我们称它为 A,其列表属性映射为 @OneToMany(cascade=CascadeType.ALL, mappedBy="attribute")。列表中的对象是 B 类的实体,并且与 A 具有双向关系。因此 B 具有指向 A 的属性,该属性映射为 @OneToOne(cascade=CascadeType.MERGE)。我从数据库中获取对象 A 并将新对象 B 添加到 A 的列表中并调用 session.update(A)

当我得到所有 A 对象调用 session.createCriteria(A.class).list();,准确访问我更新的 A 对象并且我添加的 B 对象不在列表中时,问题就出现了。

我尝试在更新 A 后拨打session.refresh(A),但问题仍然存在。

有没有人知道如何处理它。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您在 A 类上有一个 @OneToMany(cascade=CascadeType.ALL, mappedBy="attribute") 以映射到 B 元素,在 B 上您有 @OneToOne(cascade=CascadeType.MERGE) 元素 => 它不连贯。

    你应该在 B 类上有一个 @ManyToOne。

    您可以在此处查看示例:http://fruzenshtein.com/bidirectional-many-to-one-association/

    如果你想添加一个新的 B 对象,你需要处理 id 因为双向链接。

    “我从数据库中获取对象 A 并添加一个新对象 B” => B 有指向 A 的链接?如果不是,则不尊重双向链接。

    编辑:你可以在这里看到一些解释http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

    “由于关系是双向的,因此应用程序更新关系的一侧,另一侧也应该得到更新,并保持同步。在 JPA 中,就像在 Java 中一般,它是应用程序的责任, 或对象模型来维护关系。如果您的应用程序添加到关系的一侧,那么它必须添加到另一侧。”

    【讨论】:

    • 你是对的。我用 OneToMany 替换了 OneToOne,但问题仍然存在。
    • 我已经回答完毕
    • 感谢您的回复,但问题仍然存在。
    【解决方案2】:

    由于实体AB 之间存在双向关系,因此您还需要在Java 代码中维护这种关系。

    根据您的代码,让我们说:

    A.java:

    @OneToMany(cascade=CascadeType.ALL, mappedBy="attribute")
    List<B> bObjs;
    

    B.java:

    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn
    A attribute;
    

    那么为了维护Java代码中的关系,你需要像这样设置双方:

    a.setBObjs(listOfBs);
    b.setA(a);
    

    然后你可以调用session.update(a),这样hibernate就可以正确的保存实体了。

    【讨论】:

    • JoinColumn 注释是强制性的吗?如果没有,我确实像您在回复中显示的那样。
    • 如果你删除了JoinColumn,那么hibernate会默认创建一个Join表,所以不是强制的。您能否显示您尝试过的确切代码并将您的实体发布到问题中?
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多