org.hibernate.InstantiationException:实体没有默认构造函数:com.domaine.AnomalieAck
org.hibernate.InstantiationException: No default constructor for entity: com.domaine.AnomalieAck
我试图将枚举值保存到数据库中,但触发了实例化异常,这是我的映射:
@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 声明为这个数字,还有很多其他资源使用这个值作为数字。
我检查了所有内容:无参数构造函数已经定义,setter 方法已实现。
我该怎么做才能让 Hibernate 实例化这个 class?
不要嵌入枚举。
这里你需要的是自定义转换器:
转换器:
@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;
枚举class
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()
我试图将枚举值保存到数据库中,但触发了实例化异常,这是我的映射:
@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 声明为这个数字,还有很多其他资源使用这个值作为数字。
我检查了所有内容:无参数构造函数已经定义,setter 方法已实现。
我该怎么做才能让 Hibernate 实例化这个 class?
不要嵌入枚举。
这里你需要的是自定义转换器:
转换器:
@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;
枚举class
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()