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

问题描述 投票:1回答:2

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

@Entity
public class Anomalie {

    @Embedded
    private AnomalieAck ack = AnomalieAck.NON_ACQUITTEE;



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

//A no马列ACK.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。

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

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

java hibernate enums hibernate-mapping instantiation
2个回答
1
投票

不要嵌入枚举。

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

转换器:

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

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()

© www.soinside.com 2019 - 2024. All rights reserved.