我正在使用 Hibernate 3.6.10 来持久化一组对象。对象 B 包含对对象 A 的引用:
@Entity
@Table(name = "OBJECT_A")
class ObjectA {
@Id
String id;
@Basic
String name;
}
@Entity
@Table(name = "OBJECT_B")
class ObjectB {
@Id
String id;
@ManyToOne(optional = false)
@Cascade({CascadeType.SAVE_UPDATE})
ObjectA objectA;
@Basic
String name;
}
我正在尝试ObjectB
使用对持久对象的引用来创建新的实例,ObjectA
而无需先从数据库中加载实例ObjectA
。例如:
ObjectA objA = new ObjectA();
objA.id = 42; // same ID as persisted object, but not loaded from db
ObjectB objB = new ObjectB();
objB.objectA = objA;
objB.name = "The Answer";
session.save(objB);
session.save(objB)
但是失败了:
org.hibernate.PropertyValueException: not-null property references a null or transient value: ObjectA.name
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
显而易见的解决方案是ObjectA
通过 id 加载实例,但我试图解决ObjectB
通过从 JSON 反序列化创建实例的情况:
{
"ObjectB" : {
"objectA" : {"id" : 42},
"name" : "The Answer"
}
}
我想为执行反序列化的代码可以与任何映射的 Hibernate 对象一起工作而无需知道其结构的一般情况解决这个问题。给定这样一个反序列化的对象,我可以使用反射递归地遍历所有映射字段,ObjectB
并用它们持久的等价物(可能使用)“重新水化”它们Session.merge(…)
,但这听起来像是一个已解决的问题,我不想重新发明轮子.