2017-11-09 1 views
0

Speicher Ich habe eine Enumeration wie folgt definiert, wo die Werte sein sollte als -2, -1, 0, 1, 2:Frühling JPA nicht benutzerdefinierte Werte Aufzählungstyp Datenbank

public enum Rating { 

    EXTREMELY_DISSATISIFIED(-2), 
    DISSATISFIED(-1), 
    NEUTRAL(0), 
    SATISFIED(1), 
    EXTREMELY_DISSATIFIED(2); 

    private final int rating; 

    Rating(int rating) { 
     this.rating = rating; 
    } 

    public int getValue() { 
     return rating; 
    } 
} 

In meinem Modell, ich habe ein Attribut rating genannt, wie unten dargestellt:

@Entity 
public class Feedback { 
    @Column(nullable=false) 
    private Rating rating; 

    public Feedback() {} 

    public Rating getRating() { 
     return rating; 
    } 
    public void setRating(Rating rating) { 
     this.rating = rating; 
    } 
} 

Dann durch eine RESTful API, sparte ich Bewertung mit dem folgenden Code:

@Service 
public class FeedbackService { 

    @Autowired 
    private FeedbackRepository feedbackRepository; 

    public Feedback addFeedback(Feedback feedback) { 
     return feedbackRepository.save(feedback); 
    } 
} 

Also, wenn ich POST eine Anfrage wie:

{ 
    "rating": "EXTREMELY_DISSATISFIED" 
} 

Ich erwarte, dass der Wert -2 in der Postgres-Datenbank zu sehen. Allerdings sehe ich immer noch 0 als eine normale Enum würde mit 0 beginnen. Wie kann ich dies für die Datenbank anpassen, um die Werte wie -2, -1, 0, 1 und 2 zu speichern?

+0

Ein JPA-Provider werden nicht alle benutzerdefinierten Enum speichern Werte, es sei denn, dieser Anbieter hat eine spezielle Handhabung dafür, und die meisten nicht. Ich weiß, dass DataNucleus einen Weg unterstützt, wie http://www.datanucleus.org:15080/products/accessplatform_5_1/jpa/mapping.html#_enums, aber hängt davon ab, welchen Provider verwenden. – DN1

+0

Mögliches Duplikat von [Map enum in JPA mit festen Werten?] (Https://stackoverflow.com/questions/2751733/map-enum-in-jpa-with-fixed-values) –

Antwort

1

Sie können immer einen AttributeConverter verwenden, der den gespeicherten Wert anpassen kann. HERE ist ein nettes Tutorial.

+0

Das ist nützlich, danke. – swdon

1

Sie können einen benutzerdefinierten Konverter mit @Convert annotation verwenden und AttributeConverter wie folgt aus:

@Convert(converter = EnumToIntValue.class) 
private Rating rating; 

und schreiben Sie Ihre EnumToIntValue Konverter-Klasse, auf diese Weise:

public class EnumToIntValue implements AttributeConverter<Rating, Integer> { 

    @Override 
    public Integer convertToDatabaseColumn(final Rating rating) { 
     return rating.getValue(); 
    } 

    @Override 
    public Rating convertToEntityAttribute(final int dbData) { 
     if (dbData == -2) { 
      return Rating.EXTREMELY_DISSATISIFIED; 
     } else if (dbData == -1) { 
      return Rating.DISSATISFIED; 
     } else if (dbData == 0) { 
      return Rating.NEUTRAL; 
     } else if (dbData == 1) { 
      return Rating.SATISFIED; 
     }else if(dbData == 2){ 
      return Rating.EXTREMELY_SATIFIED; 
     }else{ 
      return null 
     } 
    } 
} 
+0

Ich entschied mich dafür, mit String-Werten anstelle von int zu gehen, da dies in meinem Fall keinen großen Unterschied macht, verglichen mit der Komplexität, um es funktionieren zu lassen. – swdon

Verwandte Themen