gpt4 book ai didi

java - 具有自定义类型更改的 hibernate 字段,但对象未标记为 'dirty' 以进行更新

转载 作者:行者123 更新时间:2023-12-04 07:04:50 26 4
gpt4 key购买 nike

我有一个 Hibernate 模型,它使用自定义类型来表示 boolean 字段(即,模型有一个“boolean ”对象,但数据库将 0 或 1 写入 TINYINT 字段。将 boolean 对象的值从 (true为 false 或 false 为 true) 将更改对象上的值,但 Hibernate session 管理器似乎不认为该对象有任何值更改,因此 save() 实际上并未将 SQL 写入数据库。

我是否需要在我的自定义类型中做一些特别的事情才能让它看到变化?我更喜欢强制每个对象在访问器中“脏”自己,但这也是可能的。

最佳答案

有两种解决方案。

  • Hibernate 调用 equals 方法检查对象是否已更改,然后调用 deepCopy 方法获取自定义对象的副本。因此,在您的 deepCopy 方法中,创建自定义对象的新副本并正确实现 equals 方法。
  • 第二种解决方案是使用混合方法 AccessType.FIELD 和 AccessType.PROPERTY。虽然这不是推荐的,但你可以看看它是否给了你知识。

  • 这似乎是您的映射应如下所示。
    @Entity
    @Table(name = TABLE_NAME)
    **@Access(AccessType.FIELD)**
    public class EntityClass {

    ///---some fields

    @Column(name = "CustomCol")
    @Type(type = "com.something.CustomColType")
    CustomClass customClass;

    //--getters setters

    }

    当您的类中有自定义对象并且您修改该对象时,它才不会标记为脏。
  • 解决方案 1:使用 customClass 对象更新一些其他属性。
  • 解决方案2:放@Access(AccessType.PROPERTY)在 customClass 字段上并为其提供 getter/setter。
    这将覆盖默认值 AccessType.Field你放在类里面的行为。

  • 如果您有 @Access(AccessType.PROPERTY),此问题将无法重现在类(class)。

    关于java - 具有自定义类型更改的 hibernate 字段,但对象未标记为 'dirty' 以进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268997/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com