2017-08-16 5 views
0

私はデータベースに格納するjpaエンティティを持っています。たとえば、jsonにいくつかのデータを含むフィールドがあります。クラスの代わりにJPAエンティティで使用するコンバーターの特定のインスタンスを指定する

@Convert(converter = JsonConverter.class) 
public SomeClass entities; 

JsonConverterなめらかようなものです:私は何をしたいか

@Converter(autoApply = true) 
public class JsonListConverter implements AttributeConverter<T, String> { 

} 

は、このコンバータにいくつかのコンストラクタを追加し、いくつかのタイプを使用して初期化(および状態でもよい)することであり、それを使用しますjpa変換用。

クラスを指定する代わりに、@Convertアノテーション(または他のアノテーション)を使用してコンバータの特定のインスタンスを指定することは可能ですか?

異なるエンティティではエンティティの配列やセットなどの異なるjsonフィールドを持つことができるので、すべてのケースをカバーする別々のコンバータを作成する必要はないため、これを行うことができます。コードはすべて同じですが、ジェネリック型と変換前に内部で初期化する必要のあるフィールドのみが異なります。

+0

あなたは、コンバータにいくつかの状態を与えることができることをサポートする実装を使用しているので、もしJPA 2.2は、CDIを使用して 'AttributeConverters'に注入性を可能にします。それ以外は、いいえ。 –

+0

私はデザインの誤解を感じていますが、そのような変換は可能ですが、エンティティレベルでは最もよく分かりません –

+0

おそらくこの投稿は役に立ちますhttps://stackoverflow.com/a/45628612 – Cepr0

答えて

1

equalとhashcodeメソッドが既に実装されているエンティティの抽象クラスSomeAbstractClassを記述することで、これを実現できます。状態を格納するプロパティを持つこともできます。これで具体的な実装SomeClass1はこの抽象クラスを実装し、さらに詳細を追加できます。

コンバータクラスのための今すぐ
public SomeClass1 extends SomeAbstractClass{ 
} 

public SomeClass2 extends SomeAbstractClass{ 
} 

@Converter(autoApply = true) 
public class JsonListConverter implements AttributeConverter<SomeAbstractClass, String> { 
@override 
public String convertToDatabaseColumn(SomeAbstractClass sac){ 
// Your implementation goes here 
} 
@override 
public SomeAbstractClass convertToEntityAttribute(String s){ 

    //check to find if s can be SomeClass1 
    if(checkSomeClass1(s)){ 
// return an instance of SomeClass1 
} 
    else{ 
// return an instance of SomeClass2 
} 


} 
} 
関連する問題