У меня есть кусок кода, который перестал работать сегодня. Код просто вставляет несколько экземпляров и отношений, используя 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, он больше не (но почему?).