插入时,Hibernate实体自动停止自动填充@ManyToOne关系双方

时间:2019-04-08 15:04:38

标签: java hibernate orm entity relational

我有一段代码今天停止工作。该代码仅使用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,但它不再存在(但是为什么?)。

0 个答案:

没有答案