【问题标题】:JPA mapping annotations for Object type对象类型的 JPA 映射注释
【发布时间】:2012-07-28 22:44:23
【问题描述】:

我将实现一个实体类,例如:

@Entity
public class XXXEntity {
     @Id
     private Long id;

     private Object entity;
}

但我不确定如何映射对象类型字段?

实际上,在我的项目中,对象类型包含其他几个实体,例如 A、B、C。(所有 A、B 和 C 都实现了 Serilizable 接口)

我想将它注释为@Lob,但我不确定它是否正确?因为 Object 没有实现 Serilizable 接口。

对此有什么想法吗?谢谢。

【问题讨论】:

  • 当您说“对象类型包含多个其他实体”时,您是指 JPA 实体还是其他一些对象?如果是其他 JPA 实体,为什么要将它们保存到 LOB 而不是它们自己的表?
  • 请仔细阅读问题后再提问。

标签: java hibernate jpa annotations jpa-2.0


【解决方案1】:

不,用@Lob 注释它是不正确的。您不能直接将任意 Object 注释为持久属性。 JPA 提供者无法知道如何持久化它。

根据 JPA 2.0 规范,持久属性必须是以下之一:

Java 原始类型; java.lang.String;其他 Java 可序列化类型 (包括原始类型的包装器, java.math.BigInteger,java.math.BigDecimal,java.util.Date,java.util.Calendar[5], java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[]、Character[] 和实现 可序列化接口);枚举;实体类型;实体集合 类型;可嵌入类;基本类型和可嵌入类型的集合。

你应该重新设计模型,使得基本上不需要持久化无类型数据。

【讨论】:

    【解决方案2】:

    您不能将 Object 字段注释为 @Lob。根据规范:“Lob 可以是二进制或字符类型。”

    【讨论】:

    • 您有 2 个选项:使用 JPA entity inheritance 或将实体对象反序列化为二进制数组:@Lob byte[] entity;
    • 如何将实体对象反序列化为二进制数组:@Lob byte[] 实体?有什么例子吗?谢谢
    【解决方案3】:

    您应该决定 A、B 和 C 是实体还是状态字段值。如果它们是实体并且它们可以被引用、通过它们的属性查询,那么创建一个通用的超类来继承。

    如果它们只是一个对象,那么使用 Lob 并实现 Serializable 就足够了。如果 JPA 提供程序要求您将 Object 替换为其他内容,如您所说,您可以使用 Serializable 接口,如果这不起作用,则使用实现 Serializable 的通用超类。

    【讨论】:

      【解决方案4】:

      在我看来,您想将其用作“ValueObject”(正如您提到的可序列化)而不是“Entity”。

      如果将字段视为 ValueObject 就可以了。使用 Lob 应该没问题(您总是可以通过手动序列化找到解决方法)。

      但如果你想将它们视为“实体”,将其声明为“对象”的引用是不合理的。最明显的论点之一是对象不是实体,因为它不包含任何实体身份。

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2023-03-22
        • 1970-01-01
        • 2018-07-26
        相关资源
        最近更新 更多