我正在尝试复制一个休眠实体 A,如下所示:
A a = (A) session.get(A.class, id);
session.evict(a);
a.setId(null);
session.save(a);
然而这不起作用,我得到以下异常:
org.hibernate.HibernateException: Don't change the reference to a collection with cascade="all-delete-orphan": com.test.A.B
可以安全地假设发生此错误是因为我在实体 A 中定义了 B 实体的集合:
<list name="B" table="B" lazy="false" cascade="all,delete-orphan">
<key column="A_ID" not-null="true"/>
<index column="X"/>
<one-to-many class="com.test.B"/>
</list>
如何制作实体 A 的副本(包括其实体 B 的集合)而又不会让 hibernate 不满意?
如果您想复制现有实体 - 修改它 - 并将其另存为新实体,那么您需要深度复制该对象。您可以通过序列化然后反序列化该对象来深度复制该对象。
public Object deepCopy(Object input) {
Object output = null;
try {
// Writes the object
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(input);
// Reads the object
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
output = objectInputStream.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return output;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)