java - Hibernate Envers 审计 @Embedded 内有基本类型 throws 无法在获取时将字段设置为空值

标签 java hibernate jpa orm hibernate-envers

我有一个类的外键审计实体(我不想审计):

@Entity
@Audited
public class CitaAgenda {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "reconocimiento_id")
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    private Reconocimiento reconocimiento;
    ...
}

此外,Reconocimiento 是一个具有嵌入式属性的实体:

@Entity
public class Reconocimiento {
     @Embedded
     private Enfermeria enfermeria;
     ...
}

可嵌入类如下:

@Embeddable
public class Enfermeria {
    private boolean diabetes;
    ...
}

现在,当我从修订中获取数据并获取 CitaAgenda 时,我得到一个

"Can not set boolean field ...Enfermeria.diabetes to null value".

我认为发生的事情是 Hibernate 试图用 NULL 初始化 Reconocimientoenfermeria 属性,因为它认为所有字段都是 NULL 作为 Reconocimiento 存储在 _AUD 表中的是 ID(因为其他未审核)。但这不是真的,因为如果我审核其他字段,diabetes 将是 false 而不是 NULL。

我无法将糖尿病 设置为 boolean 值。还有其他解决方案吗?提前致谢。

最佳答案

如果您可以向 Enfemeria 添加额外的注释,那么您可以使用自定义转换器对其进行标记:

嵌入类

@Convert(converter=MyBooleanConverter.class)
private boolean diabetes;

转换器类

@Converter
public class MyBooleanConverter implements AttributeConverter<Boolean, Integer>{
    @Override
    public String convertToDatabaseColumn(Boolean value) {
        if (Boolean.TRUE.equals(value)) {
            return Integer.valueOf(1);
        } else {
            return Integer.valueOf(0);
        }
    }

    @Override
    public Boolean convertToEntityAttribute(Integer value) {
        if(value != null and value.equals(1){
            return Boolean.TRUE;
        }

        return Boolean.FALSE;
    }
}

当然你可能需要考虑使用String而不是Integer来进行转换。这取决于数据库中的基础列数据类型。

关于java - Hibernate Envers 审计 @Embedded 内有基本类型 throws 无法在获取时将字段设置为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872694/

相关文章:

hibernate - 查找Hibernate实体的主键字段

java - 使用注释的条件唯一约束

java - 如何通过分页按任何字段搜索

java - EntityManager 没有名为 defaultPersistenceUnit 的持久性提供程序

java - 我的程序一直生成四次?

java - 这是一个有效的 while 循环吗?

java - 分发自签名SSL证书: How to skip requirement to import to key store

Java - 对非静态方法进行静态引用

spring - 未找到表 - 命名策略错误?

java - 与 org.iq80.snappy 存在潜在冲突