JPA/Hibernate:在复杂类上使用 AttributeConverter 时创建 UserType 是不是显而易见?
Posted
技术标签:
【中文标题】JPA/Hibernate:在复杂类上使用 AttributeConverter 时创建 UserType 是不是显而易见?【英文标题】:JPA/Hibernate: is it obvious to create UserType when using AttributeConverter on complex class?JPA/Hibernate:在复杂类上使用 AttributeConverter 时创建 UserType 是否显而易见? 【发布时间】:2016-04-12 07:43:35 【问题描述】:我想将任意 POJO 类属性映射为 String
和 AttributeConverter<SomeClass, String>
,但我明白了:
警告:找不到请求的 Java 类 [SomeClass] 的匹配类型描述符;使用后备
这是否意味着AttributeConverter
还不够,我需要为每个复杂类编写一个自定义UserType
才能将其转换为String
并返回?
Another solution 需要@Embeddable
。这里更适合吗?
@Entity
public class SomePersistentClass
@Id
int id;
@Convert(converter = SomeClassConverter.class)
public SomeClass attribute;
//...
public class SomeClass
//...
【问题讨论】:
其他 JPA 实现(例如 DataNucleus)就足够了,因为 AttributeConverter 是一条指令,可以说“作为这种支持的类型持续存在”。如果 Hibernate 要求这样做,那么您有权向他们提出问题 【参考方案1】:老问题,但从 Hibernate 5.2.7(2017 年 1 月 24 日)开始,此警告更改为:
警告 org.hibernate.type.descriptor.java.JavaTypeDescriptorRegistry - HHH000481:遇到了我们可以处理的 Java 类型 [class SomeClass] 找不到 JavaTypeDescriptor 并且似乎没有实现 等于和/或哈希码。这可能会导致显着的性能 执行涉及此 Java 的相等/脏检查时的问题 类型。考虑注册一个自定义 JavaTypeDescriptor 或至少 实现equals/hashCode。所以,有以下解决方案:
要解决这个问题,只需确保您的类型实现 equals 和 hashcode,并使用 Immutable.class 对其进行注释,以防它是不可变的。
见:JavaTypeDescriptorRegistry - Could not find matching type descriptor for requested Java class
【讨论】:
【参考方案2】:用
定义 pojo@Named
实现转换器
重写 getAsObject 和 getAsString 方法
【讨论】:
什么是@Named?
Hibernate 和 JPA 没有这个注解。可以举个例子吗?
@Named 应该是 JavaEE6 的标准,与 CDI 有关,
如果用户没有使用 JavaEE 或 CDI ?!
哦,我明白了,我们谈论的是转换的不同方面,你的应该和这个有关:thoughts-on-java.org/jpa-21-how-to-implement-type-converter以上是关于JPA/Hibernate:在复杂类上使用 AttributeConverter 时创建 UserType 是不是显而易见?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data JPA + Hibernate 将方法标记为事务