【问题标题】: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 要求这样做,那么您有权向他们提出问题

标签: java hibernate jpa orm


【解决方案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
    1. @Named

    2. 实现转换器

    3. 重写 getAsObject 和 getAsString 方法

    【讨论】:

    • 什么是@Named? Hibernate 和 JPA 没有这个注解。可以举个例子吗?
    • @Named 应该是 JavaEE6 的标准,与 CDI 有关,
    • 如果用户没有使用 JavaEE 或 CDI ?!
    • 哦,我明白了,我们谈论的是转换的不同方面,你的应该和这个有关:thoughts-on-java.org/jpa-21-how-to-implement-type-converter
    猜你喜欢
    • 1970-01-01
    • 2014-04-17
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多