我将实现一个实体类,如:
@Entity
public class XXXEntity {
@Id
private Long id;
private Object entity;
}
但我不确定如何映射对象类型字段?
实际上,在我的项目中,对象类型包含其他几个实体,如A,B,C(所有A,B和C都实现了Serilizable接口)
我想将其注释为@Lob,但我不确定它是否正确?因为Object没有实现Serilizable接口。
有关于此的任何想法?感谢。
答案 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不是实体,因为它不包含任何实体身份。