首页 > 解决方案 > org.hibernate.InstantiationException:没有实体的默认构造函数:com.domaine.AnomalieAck

问题描述

我正在尝试将枚举值持久保存到数据库中,但触发了实例化异常,这是我的映射:

@Entity
public class Anomalie {

    @Embedded
    private AnomalieAck ack = AnomalieAck.NON_ACQUITTEE;



    public Anomalie() {
    }
/*getters and setters*/
}

//异常确认.java

public enum AnomalieAck {

    NON_ACQUITTEE(0),

    ACQUITTEE_APP1 (1),

    ACQUITTEE_APP2(2),

    /** Aacquittee en erreur. */
    ACQUITTEE_ERREUR(10),

    @Column(name = "ANO_ACK")
    private int ack = 0;

  private AnomalieAck() {

    }

  private AnomalieAck(final int value) {
    this.ack = value;
   }
  public int getValue() {
        return this.ack;
    }
  public void setAck(int ack) {
        this.ack = ack;
    }
}

我没有使用@Enumerated(EnumType.STRING)or的原因@Enumerated(EnumType.ORDINAL)是在数据库中字段ANO_ACK被声明为数字,并且有很多其他资源使用这个值作为数字。

我已经检查了所有内容:已经定义了无参数构造函数,实现了 setter 方法。

我该怎么做才能让 Hibernate 实例化这个类?

标签: javahibernateenumshibernate-mappinginstantiation

解决方案


不要嵌入枚举。

您需要的是一个自定义转换器:

转换器

@Converter
public class AnomalieAckConverter implements AttributeConverter<AnomalieAck , Integer> {

 @Override
 public String convertToDatabaseColumn(AnomalieAck  anomalieAck ) {
   return anomalieAck.getValue();
 }

 @Override
 public AnomalieAck convertToEntityAttribute(Integer ack) {
    retrun AnomalieAck.getByValue(ack);
 }

}

实体:

@Column
@Convert(converter = AnomalieAckConverter.class)
private AnomalieAck ack;

推荐阅读