JPA映射注释对象类型
我将实现一个实体类,喜欢的东西:JPA映射注释对象类型
@Entity
public class XXXEntity {
@Id
private Long id;
private Object entity;
}
但我不知道如何对象类型字段映射?
其实,在我的项目的对象类型包含其他几个实体,如A,B,C(全部A,B和C实现Serilizable接口)
我想注释它作为@Lob,但我不确定这是否正确?因为Object没有实现Serilizable接口。
有关于此的任何想法?谢谢。
不,用@Lob注释它是不正确的。您不能直接将任意对象注释为持久属性。 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 []和实现可串行化接口的用户定义类型);枚举;实体类型;实体 类型的集合;可嵌入类;基本和可嵌入类型的集合。
您应该重新设计模型,以便不需要基本上保留无类型的数据。
您不能将对象字段注释为@Lob。根据规范:“一个Lob可能是一个二进制或字符类型。”
您应该决定A,B和C是实体还是状态字段值。如果它们是实体并且它们可以被引用,通过它们的属性来查询,那么创建一个通用的超类。
如果它们只是一个对象,那么使用Lob和实现Serializable就足够了。如果JPA提供者要求你用其他东西替换Object,就像你所说的那样,你可以使用Serializable接口,如果这样做不起作用,那么就是一个实现Serializable的普通超类。
在我看来,你想用它作为“ValueObject”(如你提到的可序列化)而不是“实体”。
如果将该字段视为ValueObject,那很好。使用Lob应该没问题(并且您总是可以通过手动序列化来找到解决方法)。
但是,如果您想将它们视为“实体”,将其声明为“对象”的参考永远是合理的。其中最明显的一个参数是Object不是一个实体,因为它不包含任何实体标识。
当你说“对象类型包含其他几个实体”时,你是指JPA实体还是其他一些对象?如果是其他JPA实体,为什么要将它们保存到LOB而不是自己的表中? – 2012-07-31 07:54:16
请仔细阅读问题,然后询问。 – ttt 2012-07-31 12:56:12