2012-07-31 209 views
0

我将实现一个实体类,喜欢的东西:JPA映射注释对象类型

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

    private Object entity; 
} 

但我不知道如何对象类型字段映射?

其实,在我的项目的对象类型包含其他几个实体,如A,B,C(全部A,B和C实现Serilizable接口)

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

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

+0

当你说“对象类型包含其他几个实体”时,你是指JPA实体还是其他一些对象?如果是其他JPA实体,为什么要将它们保存到LOB而不是自己的表中? – 2012-07-31 07:54:16

+0

请仔细阅读问题,然后询问。 – ttt 2012-07-31 12:56:12

回答

0

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

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

+0

是正确的还是不正确的?谢谢 – ttt 2012-07-31 12:57:28

+0

我想我可以使用Serializable而不是Object,它应该可以工作... – ttt 2012-07-31 14:23:31

0

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

+0

所以我可以知道什么是最好的解决方案吗?谢谢 – ttt 2012-07-31 13:07:10

+0

你有2个选择:使用[JPA实体继承](http://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html)或de/serialize实体对象作为二进制数组:@Lob byte [ ] 实体; – Arvik 2012-07-31 14:08:04

+0

我想我可以使用Serializable而不是Object,它应该工作... – ttt 2012-07-31 14:23:55

0

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

如果它们只是一个对象,那么使用Lob和实现Serializable就足够了。如果JPA提供者要求你用其他东西替换Object,就像你所说的那样,你可以使用Serializable接口,如果这样做不起作用,那么就是一个实现Serializable的普通超类。

0

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

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

但是,如果您想将它们视为“实体”,将其声明为“对象”的参考永远是合理的。其中最明显的一个参数是Object不是一个实体,因为它不包含任何实体标识。