1

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

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

     private Object entity;
}

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

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

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

有什么想法吗?谢谢。

4

4 回答 4

0

No, it is not correct to annotate it with @Lob. You cannot directly annotate arbitrary Object as a persistent attribute. JPA provider have no way to know how to persist it.

According JPA 2.0 specification persistent attribute must be one of following:

Java primitive types; java.lang.String; other Java serializable types (including wrappers of the primitive types, 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[], and user-defined types that implement the Serializable interface); enums; entity types; collections of entity types; embeddable classes; collections of basic and embeddable types.

You should redesign model such a way that there is no need to persist basically typeless data.

于 2012-07-31T07:55:55.410 回答
0

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

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

于 2012-08-03T01:26:30.570 回答
0

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

于 2012-07-31T08:05:00.400 回答
0

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

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

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

于 2012-08-03T01:40:36.067 回答