org.hibernate.InstantiationException: нет конструктора по умолчанию для сущности: com.domaine.AnomalieAck - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь сохранить перечисление Value в базе данных, но сработало исключение, вот мое отображение:

@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 объявлено как число, и существует множество других ресурсов, которые используют это значение как номер.

Я проверил все: конструктор без аргументов уже определен, реализован метод установки.

Что я могу сделать, чтобы позволить Hibernate создать экземпляр этого класса?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Не вставляйте enum.

Здесь вам нужен специальный конвертер:

Конвертер :

@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 голосов
/ 04 апреля 2019

Enum 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 is getValue ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...