2017-11-09 12 views
0

にカスタム値の列挙型を保存していない私は、値が-2、-1、0、1、2のようになっている場合、以下のように定義された列挙型を有しますこのモデルは、私は以下に示すように、属性がratingと呼ばれています:スプリングJPAがデータベース

@Service 
public class FeedbackService { 

    @Autowired 
    private FeedbackRepository feedbackRepository; 

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

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

その後、RESTfulなAPIを介して、私は次のコードを使用して評価を保存しました

{ 
    "rating": "EXTREMELY_DISSATISFIED" 
} 

が、私は値-2 Postgresデータベース内を期待:

だから、私のような要求をPOSTとき。ただし、通常の列挙型は0から始まるため、0が表示されます。-2、-1、0、1、2の値をデータベースに格納するには、これをどのように調整できますか?

+0

JPAプロバイダは、任意のカスタム列挙型は保存されませんそのプロバイダが特別な処理をしていない場合や、そうでない場合の値はありません。 DataNucleusは、http://www.datanucleus.org:15080/products/accessplatform_5_1/jpa/mapping.html#_enumsのように一方通行をサポートしていますが、どのプロバイダが使用しているかによって異なります。 – DN1

+0

[固定値のJPAでMap enumを複製していますか?](https://stackoverflow.com/questions/2751733/map-enum-in-jpa-with-fixed- valuesues) –

答えて

1

いつでも保存された値をカスタマイズできるAttributeConverterを使用できます。 HEREは素敵なチュートリアルです。

+0

これは便利です。ありがとうございます。 – swdon

1

あなたはこのよう@Convert annotationAttributeConverterでカスタムコンバータを使用することができます。

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

そして、このようにあなたのEnumToIntValueコンバータクラスを記述します。

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

私はint型ではなく文字列型の値を使うことにしました。これは、複雑に比べて私の場合に大きな違いはありません。 – swdon

関連する問題