2017-08-16 47 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字段,如实体或集合数组,或其他smth字段,所以我不想编写单独的转换器来覆盖所有情况,因为代码对于所有这些代码都是相同的,它们只有泛型类型和一些在转换之前应该初始化的字段。

+0

JPA 2.2允许注入性成'使用CDI,因此,如果您使用的是支持,你可以给一个转换器的一些状态的实现AttributeConverters'。除此之外,没有。 –

+0

我觉得设计误解,这样的转换是可能的,但我不确定最好在实体级别 –

+0

也许这个帖子会很有用https://stackoverflow.com/a/45628612 – Cepr0

回答

1

你可以通过为你的实体编写一个抽象类SomeAbstractClass来达到这个目的,其中已经实现了相等和hashcode方法。它也可以具有存储状态的属性。现在你的具体实现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 
} 


} 
} 
相关问题