org.hibernate.InstantiationException:实体的默认构造函数:com.domaine.AnomalieAck

时间:2019-04-04 09:23:48

标签: java hibernate enums hibernate-mapping instantiation

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

@Entity
public class Anomalie {

    @Embedded
    private AnomalieAck ack = AnomalieAck.NON_ACQUITTEE;



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

// AnomalieAck.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)@Enumerated(EnumType.ORDINAL)的原因是,在数据库中,字段 ANO_ACK 被声明为数字,还有很多其他使用此值作为Number的资源。

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

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

2 个答案:

答案 0 :(得分:1)

请勿嵌入枚举。

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

转换器

Database

实体:

@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);
 }

}

答案 1 :(得分:0)

枚举类

public enum AnomalieAck {

    NON_ACQUITTEE(0),

    ACQUITTEE_APP1 (1),

    ACQUITTEE_APP2(2),

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


    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;
    }

public static AnomalieAck getByValue(int ackNumero) {
    for (final AnomalieAck ackitement : AnomalieAck.values()) {

        if (ackitement.getValue() == ackNumero) {
            return ackitement;
        }
    }

    return null;
}

}

转换器:

public class AnomalieAckConverter implements AttributeConverter<AnomalieAck, Integer> {

    /**
     * @param attribute
     * @return
     * @see javax.persistence.AttributeConverter#convertToDatabaseColumn(java.lang.Object)
     */
    @Override
    public Integer convertToDatabaseColumn(AnomalieAck anoAck) {
        // TODO Auto-generated method stub
        return anoAck.getValue();
    }

    /**
     * @param dbData
     * @return
     * @see javax.persistence.AttributeConverter#convertToEntityAttribute(java.lang.Object)
     */
    @Override
    public AnomalieAck convertToEntityAttribute(Integer ack) {
        // TODO Auto-generated method stub
        return AnomalieAck.getByValue(ack);

    }

该解决方案正在工作,但它保留序数值而不是其int值,getAck是getValue()