我有一段代码今天停止工作。该代码仅使用hibernate插入一些实例和关系。这是一个非常大的代码(涉及50多个表),但是我将尝试简化它,看看是否可以弄清为什么它不起作用,并且说实话,为什么它以前起作用(从某种意义上说,它是行不通的。)
我们只需使用两次操作创建一个实体 Element ,插入所有内容,然后在同一笔交易中执行 Element.getOperations() ,结果是一个空列表。我们没有将操作列表添加到元素实体对象中,只是将元素添加到每个操作中。但是,这已经工作了多年。
代码(极其简化):
public Element addElement(Object data) {
Element em = new Element(data);
dao.insert(em);
Operation op1 = new Operation(data);
op1.setElement(em);
dao.insert(op1);
Operation op2 = new Operation(data);
op2.setElement(em);
dao.insert(op2);
for (Operation o : em.getOperations()) { //<-- this returns empty list!!
//we never get here due to empty list
}
return em;
}
实体:
@Entity
@Table(name = "OPERATION")
public class Operation extends EntityId {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_ELEMENT")
private Element element;
}
@Entity
@Table(name = "ELEMENT")
public class ELEMENT extends EntityId {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "element")
@Fetch(value = FetchMode.SUBSELECT)
@OrderBy(clause = "ID ASC")
@Sort(type = SortType.NATURAL)
List<Operation> operations;
}
我不是要寻找解决方案,因为它已经解决了(冲洗和清除解决了问题,手动设置Element.setOperations(listOperations)也可以解决)。我很好奇它为什么以前能起作用。
一些信息:
最近在某些实体上进行了一些更改,例如FetchModes或FetchTypes,但是在这种情况下受影响的那些保持不变
在工作时,element.getOperations()触发了SELECT,但它不再存在(但是为什么?)。