Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有自定义类型更改的休眠字段,但对象未标记为';肮脏';更新_Java_Hibernate - Fatal编程技术网

Java 具有自定义类型更改的休眠字段,但对象未标记为';肮脏';更新

Java 具有自定义类型更改的休眠字段,但对象未标记为';肮脏';更新,java,hibernate,Java,Hibernate,我有一个Hibernate模型,它使用自定义类型来表示布尔字段(即,模型有一个“boolean”对象,但数据库将0或1写入一个TINYINT字段。将布尔对象的值从(true改为false或false改为true)将更改对象上的值,但Hibernate会话管理器似乎认为该对象没有任何值更改,因此save()实际上不会将SQL写入数据库 我是否需要在自定义类型中执行一些特殊的操作以使其看到更改?我更希望这样做,而不是强制每个对象在访问器中“脏”自己,但这也是可能的。首先,是否有任何理由使用自定义类型

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


我是否需要在自定义类型中执行一些特殊的操作以使其看到更改?我更希望这样做,而不是强制每个对象在访问器中“脏”自己,但这也是可能的。

首先,是否有任何理由使用自定义类型而不是Hibernate的内置布尔类型

<property name="some_flag" type="boolean"/>

其次,不需要,您不需要在自定义类型中执行任何“特殊”操作,但需要正确实现其
equals()
deepCopy()
方法。您可以发布源代码吗?

实际上不保存对象(或其更改)到数据库。它将其标记为持久性,即Hibernate认为已管理的对象。如果该对象已分离,请调用

你的工作完成了吗?和/或


您可能想再次检查上的Hibernate手册(我不是说这很讽刺;我今天也遇到了Hibernate的同样问题-忘记了
save()
和其他方法之间的区别,也忘记了
flush()
我的会话)。

有两种解决方案

  • 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)
    ,则此问题将不可复制