【问题标题】:Version of the parent object does not change when its child object's state changes当子对象的状态改变时,父对象的版本不会改变
【发布时间】:2015-01-30 17:59:50
【问题描述】:

我正在使用 Hibernate3 我有一个简单的一对多关系(父对象有一组子对象) 如果添加/删除子对象,则更新父对象的版本,如果子对象的状态发生更改,则父对象的版本不会更新。

这是映射 - 类别.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.codejava.hibernate">
<class name="Category" table="CATEGORY">
    <id name="id" column="CATEGORY_ID">
        <generator class="native"/>
    </id>
    <property name="name" column="NAME" />
    <version name="version" type="integer" column="version" unsaved-value="null" />
    <set name="products" inverse="true" cascade="all-delete-orphan">
        <key column="CATEGORY_ID" not-null="true" />
        <one-to-many class="Product"/>
    </set>
</class> 

Product.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.codejava.hibernate">
<class name="Product" table="PRODUCT">
    <id name="id" column="PRODUCT_ID">
        <generator class="native"/>
    </id>
    <version name="version" type="integer" column="version" unsaved-value="null" />
    <property name="name" column="NAME" />
    <property name="description" column="DESCRIPTION" />
    <property name="price" column="PRICE" type="float" />

    <many-to-one name="category" class="Category"
        column="CATEGORY_ID" not-null="true"/>
</class> 

当 Product 发生变化时,Product.version 会正确更新,但 Category.version 保持不变。

我认为这是一个跨领域的问题,必须有一个合理的解决方案。我做了很多搜索,但找不到一个。请帮帮我

【问题讨论】:

    标签: java mysql hibernate jpa persistence


    【解决方案1】:

    是的,恐怕这只是休眠方式的一个限制。唯一的解决方案是在需要进行更改时在双方都进行更改。

    您也可以刷新父级,但请记住,这会影响数据库。

    【讨论】:

    • 那么..当孩子(一对多)的状态发生变化时,没有办法更新父母的版本吗?
    【解决方案2】:

    这可能是一种主观意见,但对我来说,这样看来是合乎逻辑的。但是,一种常见的处理方法是在父实体上设置类似 lastUpdated 的字段,您可以在每次调用 update 之前设置它。这可以在@PrePersist 和/或@PreUpdate 中完成,它可以确保实体版本在您更新时发生变化,而不管对其或其关系进行了哪些更改。

    【讨论】:

    • 是的......我想到了......但它似乎是一种完成这项工作的 hacky 方式。想知道是否有更好的方法。
    • 刚找到this suggestion,你可以试试。除此之外,我想不出任何其他非 hacky 解决方案。
    • 谢谢。我想我会继续自己针对业务案例进行脏检查,看看版本是否发生了变化。
    • 我尝试了@PreUpdate 解决方案,但它对我不起作用。如果只有孩子发生了变化,则父母实际上并没有调用 PreUpdate。可能我做错了什么,但我想我会警告人们这可能行不通。
    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2013-11-23
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2023-01-09
    相关资源
    最近更新 更多