Version of the parent object does not change when its child object’s state changes
我正在使用 Hibernate3
我有一个简单的一对多关系(父对象有一组子对象)
如果添加/删除子对象,则更新父对象的版本,如果子对象的状态发生更改,则父对象的版本不会更新。
这是映射 –
类别.hbm.xml
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?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
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?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” |
当 Product 发生变化时,Product.version 会正确更新,但 Category.version 保持不变。
我认为这是一个跨领域的问题,必须有一个合理的解决方案。我做了很多搜索,但找不到一个。请帮帮我
是的,这只是hibernate工作方式的一个限制,恐怕。唯一的解决方案是在需要进行更改时在两侧进行更改。
您也可以刷新父对象,但请记住,这会影响数据库。
- 所以..当孩子(一对多)的状态发生变化时,没有办法更新父母的版本吗?
这可能是一种主观意见,但对我来说,这样看来是合乎逻辑的。但是,一种常见的处理方法是在父实体上设置类似 lastUpdated 的字段,您每次在调用 update 之前都要设置它。这可以在 @PrePersist 和/或 @PreUpdate 中完成,它会确保实体版本在您更新它时发生变化,而不管对其或其关系进行了哪些更改。
- 是的……我想到了……但这似乎是一种完成这项工作的黑客方式。想知道是否有更好的方法。
- 刚找到这个建议,你可以试试。除此之外,我想不出任何其他非 hacky 解决方案。
- 谢谢。我想我会继续自己针对业务案例进行脏检查,看看版本是否发生了变化。
- 我尝试过@PreUpdate 解决方案,但它对我不起作用。如果只有孩子发生了变化,则父母实际上并没有调用 PreUpdate。可能我做错了什么,但我想我会警告人们这可能行不通。
来源:https://www.codenong.com/27250271/