指定在JPA实体中使用的转换器的特定实例,而不是类
问题描述:
我有一些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字段,所以我不想编写单独的转换器来覆盖所有情况,因为代码对于所有这些代码都是相同的,它们只有泛型类型和一些在转换之前应该初始化的字段。
答
你可以通过为你的实体编写一个抽象类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
}
}
}
JPA 2.2允许注入性成'使用CDI,因此,如果您使用的是支持,你可以给一个转换器的一些状态的实现AttributeConverters'。除此之外,没有。 –
我觉得设计误解,这样的转换是可能的,但我不确定最好在实体级别 –
也许这个帖子会很有用https://*.com/a/45628612 – Cepr0