How to persist an Enum Value instead of the Ordinal

1.4k Views Asked by At

I am trying to persist in the database the value of ack(Enum) but when it's persisted, it takes the ordinal value instead of the value itself. What can i Do to save the value instead of Ordinal? here are my classes :

Converter

@Convert
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();
        return null;
    }

    /**
     * @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);

        return null;

    }

Enum :

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

Java class :

@Column(name = "ANO_ACK")
@Convert(converter = AnomalieAckConverter.class)
private AnomalieAck ack = AnomalieAck.NON_ACQUITTEE;

Is there a way to let hibernate persist the value instead of the ordinal value ?

2

There are 2 best solutions below

5
On

Testing locally with this converter:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

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

        @Override
        public Integer convertToDatabaseColumn(final AnomalieAck attribute)
        {
            return attribute.getValue();
        }


        @Override
        public AnomalieAck convertToEntityAttribute(final Integer dbData)
        {
            return AnomalieAck.getByValue(dbData);
        }
}

and this entity field definition

    @Column(name = "ANO_ACK")
    @Convert(converter = AnomalieAckConverter.class)
    private AnomalieAck ack = AnomalieAck.ACQUITTEE_ERREUR;

then the ack value in the enum is persisted rather than the ordinal. Are the code examples you have provided reproducing the issue for you?

3
On
@Converter(autoApply = true)
public class AnomalieAckConverter 
implements 
AttributeConverter<AnomalieAck, 
Integer> {


    @Override
    public Integer convertToDatabaseColumn(AnomalieAck 
anoAck) {
      if(anoAck != null)
        return anoAck.getValue();
    // TODO Auto-generated method stub
    // return anoAck.getValue();
      return null;
   }

/**
 * @param dbData
 * @return
 * @see javax.persistence.AttributeConverter#convertToEntityAttribute(java.lang.Object)
 */
    @Override
    public AnomalieAck convertToEntityAttribute(Integer ack) {
    // TODO filtering and returning the enum instance
    
      if(ack != null)
        return Stream.of(AnomalieAck.values())
     .filter(data -> data.getValue() == ack).findFirst().orElseThrow(IllegalArgumentException::new);

      return null;

}

Entity field definition

private AnomalieAck ack;

Use setter method to inject the ack in your service class.