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 类属性映射为 StringAttributeConverter<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 是不是显而易见?的主要内容,如果未能解决你的问题,请参考以下文章

动态(复杂)查询 JPA/Hibernate 上的动态参数

使用具有复杂条件的 JPA 实体图

Spring Data JPA + Hibernate 将方法标记为事务

JPA,Hibernate,ibatis(mybatis)如何选用?

在 JPA/Hibernate 中正确使用 flush()

使用 JPA 和 Hibernate 注册 SQL 函数