Hibernate Entities перестал автоматически заполнять отношения @ManyToOne с обеих сторон при вставке - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть кусок кода, который перестал работать сегодня. Код просто вставляет несколько экземпляров и отношений, используя Hibernate. Это действительно большой код (задействовано более 50 таблиц), но я постараюсь упростить его и посмотрим, сможем ли мы выяснить, почему он не работает, и, если честно, почему он работал до (поскольку это имеет смысл, это не работает).

Мы просто создаем сущность Элемент с двумя операциями , вставляем все, и когда мы делаем Element.getOperations () в той же транзакции, результат пустой список . Мы не добавили список операций к элементу Entity Object , просто элемент для каждой операции. Тем не менее, это работает в течение многих лет.

Код (предельно упрощенный):

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, он больше не (но почему?).

...