Hibernate Envers审计@Embedded与throws中的基本类型无法在fetch上将字段设置为空值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate Envers审计@Embedded与throws中的基本类型无法在fetch上将字段设置为空值相关的知识,希望对你有一定的参考价值。

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

@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时,我得到了一个

“无法设置布尔字段...... Enfermeria.diabetes为null值”。

我认为它发生的是Hibernate尝试用NULL初始化Reconocimiento的enfermeria属性,因为它认为所有字段都是NULL,因为存储在_AUD表中的Reconocimiento的唯一字段是ID(因为其他字段未被审计)。但这不是真的,好像我审核其他领域,糖尿病将是假的而不是NULL。

我不能将糖尿病设置为布尔值。还有其他解决方案吗?提前致谢。

答案

如果您可以向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进行转换。它取决于数据库中的基础列数据类型。

以上是关于Hibernate Envers审计@Embedded与throws中的基本类型无法在fetch上将字段设置为空值的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Hibernate java 项目中使用“Envers”审计表

仅生成 Hibernate Envers 的审计表

审计:对子修改的父实体修订(Javers/Envers/... + Hibernate)

Hibernate Envers - 在启动时填写审计表

Hibernate Envers - 一起审计多个实体

Hibernate Envers 管理的审计表的主键是啥?