我有两个Classes'Method'和'BackendMethod',它们是一对多的关系。我在BackentMethod.java中使用了'方法'集合中的mappedBy-annotation。
我制作了一个名为methodCopy的实例methodOriginal的副本,并将其保留。 现在我想让methodOriginal引用的所有BackendMethods也被methodCopy引用。
我不想复制它们,只需再将它们分配给新的“方法”。
当我将它们分配给他们时:
methodCopy.setBackendMethoden(methodOriginal.getBackendMethoden()));
我得到一个HibernateException:
HibernateException:找到对集合的共享引用:Method.backendMethoden
当我像这样复制整套时:
methodCopy.setBackendMethoden(new HashSet<Backend>(methodOriginal.getBackendMethoden())));
methodCopy.persist();
之后该集合将为null。
我做错了什么?
答案 0 :(得分:1)
我不想复制它们,只需再将它们分配给新的“方法”。
这不起作用,因为您已将method和backendMethod之间的关系定义为oneToMany。一个BackendMethod实体只能由一个Method(原始)实体引用。如果你想要一个MethodCopy的同一组backendMethods,那么你需要一组新的backendMethod对象。在这种情况下,那些后端方法实体在您的数据库中重复(当然使用不同的PK)。
或者您可以将关系更改为manytomany。
答案 1 :(得分:0)
当你在hibernate中复制引用时,请记住将id值和relationsship值设置为null。这是我通常做的,
因此,您需要遍历methodOriginal.getBackendMethoden()
并将引用和ids
设置为null
,然后将其设置为methodCopy
。
还要确保methodCopy
和id值为null
。
然后,这将被视为一个新对象,并将被保留。