Hibernate:删除和添加相同的实体与orphanRemoval,实体被删除



我对Hibernate有一个奇怪的行为。我的环境是夸库斯和帕纳奇,但我认为这与问题无关。

我使用一个简单的树实体与id,父和子。我的moveInto方法只是将一个子元素移动到另一个父元素中:

  • 我从旧的父元素中删除了子元素
  • 我在新的父元素中添加了子元素

在事务完成后,子节点被完全删除,并且不考虑添加操作。

这是正常行为吗?

实体:

@Entity(name = "Element")
@Access(AccessType.PROPERTY)
@Inheritance(strategy = InheritanceType.JOINED)
public class Element {
private Long id;

private Element parent;

private List<Element> subActivities = new ArrayList<>();

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////// Getteur Setteur /////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}

@JsonManagedReference
@OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
public List<Element> getSubActivities() {
return this.subActivities;
}
public void setSubActivities(List<Element> sousactivites) {
this.subActivities = sousactivites;
}

@JsonBackReference
@ManyToOne()
@JoinColumn(name = "parent", referencedColumnName = "id")
public Element getParent() {
return this.parent;
}
public void setParent(Element parent) {
this.parent = parent;
}

我的服务:

@ApplicationScoped
public class ElementService {
@Inject
ElementRepository repository;
public static Long id1;
public static Long id2;
public static Long id3;
/** Prepare the test */
@Transactional
public void create() {
Element element1 = new Element();
Element element2 = new Element();
Element element3 = new Element();

this.add(element1, element3);

repository.persist(element1);
repository.persist(element2);
repository.persist(element3);
id1 = element1.getId();
id2 = element2.getId();
id3 = element3.getId();
}
/** Test method */
public void test() {
Element element1 = repository.findById(id1);
Element element2 = repository.findById(id2);
Element element3 = repository.findById(id3);
System.out.println("________________ before _____________");
System.out.println(element1 +" "+ element1.getSubActivities());
System.out.println(element2 +" "+ element2.getSubActivities());

moveInto(element2.getId(), element3.getId());

Element element01 = repository.findById(id1);
Element element02 = repository.findById(id2);
Element element03 = repository.findById(id3);

System.out.println("________________ after _____________");
System.out.println(element01 +" "+ element01.getSubActivities());
System.out.println(element02 +" "+ element02.getSubActivities());
}
/** Problematic method */
@Transactional
public void moveInto(Long parentId, Long nodeId) {
Element parent = repository.findById(parentId);
Element node = repository.findById(nodeId);
moveInto(parent, node);
}

void moveInto(Element parent, Element tnode) {
this.remove(tnode);
this.add(parent, tnode);
}

void remove(Element node) {
if (node.getParent() != null) {
boolean deleted = node.getParent().getSubActivities().remove(node);
node.setParent(null);
System.out.println("isDeleted ? : " + deleted);
}
}
void add(Element parent, Element value) {
if (parent.getSubActivities() != null) {
boolean added = parent.getSubActivities().add(value);
value.setParent(parent);
System.out.println("isAdded ? : " + added);
}
}
}

结果:

________________ before _____________
fr.projetlineaire.ganttonline.activity.test.Element@5213dcac [fr.projetlineaire.ganttonline.activity.test.Element@34699167]
fr.projetlineaire.ganttonline.activity.test.Element@44cbb4c2 []
isDeleted ? : true
isAdded ? : true
________________ after _____________
fr.projetlineaire.ganttonline.activity.test.Element@5213dcac []
fr.projetlineaire.ganttonline.activity.test.Element@44cbb4c2 []

这可能是一个Hibernate错误,您应该在问题跟踪器(https://hibernate.atlassian.net)上提交一个错误票据,并使用再现该问题的测试用例(https://github.com/hibernate/hibernate-test-case-templates/blob/master/orm/hibernate-orm-5/src/test/java/org/hibernate/bugs/JPAUnitTestCase.java)。

我确实认为,在这种特殊情况下,孤儿的移除并不像你所期望的那样起作用。问题可能是您正在使用mappedBy,但是最好只是提交问题并等待Hibernate团队对该问题的分析。

最新更新