JPA映射对象类型的注释

时间:2012-07-31 07:51:14

标签: java hibernate jpa annotations jpa-2.0

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

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

     private Object entity;
}

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

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

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

有关于此的任何想法?感谢。

4 个答案:

答案 0 :(得分:0)

不,用@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 []和实现的用户定义类型   可序列化接口);枚举;实体类型;实体的集合   类型;可嵌入的课程;基本和可嵌入类型的集合。

您应该重新设计模型,以便不需要保留基本无类型的数据。

答案 1 :(得分:0)

您无法将对象字段注释为@Lob。根据规范:“Lob可以是二进制或字符类型。”

答案 2 :(得分:0)

您应该确定A,B和C是实体还是州字段值。如果它们是实体并且可以通过它们的属性进行引用,则可以创建一个公共超类来继承它。

如果它们只是一个对象,那么使用Lob并实现Serializable就足够了。如果JPA提供者要求你用其他东西替换Object,正如你所声明的那样你可以使用Serializable接口,如果那不起作用,那么就是一个实现Serializable的公共超类。

答案 3 :(得分:0)

在我看来,你想把它用作“ValueObject”(如你所提到的可序列化的)而不是“Entity”。

如果将字段视为ValueObject,则可以。使用Lob应该没问题(你总能通过手动序列化来找到解决方法)。

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