У меня есть объект, который имеет два соотношение manyToMany с самим собой, и я не хочу использовать Cascade.MERGE, потому что мне нужно сделать некоторые проверки данных для проверки данных:JPA: отношение manyToMany на одной и той же сущности
@Entity("device")
public class Device {
...
@ManyToMany(mappedBy = "parents", targetEntity = Device.class, fetch = FetchType.LAZY)
public Set<Device> getChildren() {
return this.children;
}
@Override
@ManyToMany(targetEntity = Device.class, fetch = FetchType.LAZY)
@JoinTable(name = "dem_hierarchy", joinColumns = {
@JoinColumn(name = "CHILDREN_UUID", referencedColumnName = "UUID")},
inverseJoinColumns = {
@JoinColumn(name = "DEM_DEVICE_UUID", referencedColumnName = "UUID")})
public Set<Device> getParents() {
return parents;
}
...
}
Когда я сохранить дерево, как это: метод
Device grandGrandPa = new Device();
grandGrandPa.setName("TEST" + counter + "_grandGrandPa");
Device grandPa = new Device();
grandPa.setName("TEST" + counter + "_grandPa");
grandGrandPa.addChild(grandPa);
Device daddy = new Device();
daddy.setName("TEST" + counter + "_daddy");
grandPa.addChild(daddy);
Device son = new Device();
son.setName("TEST" + counter + "_son");
daddy.addChild(son);
grandGrandPa = deviceService.register(grandGrandPa);
регистра является рекурсивным и она спускается по дереву с помощью колонки детей. Когда его черед «дедушка», который будет сохранен WebLogic возвращает исключение:
вызвано следующими причины: org.hibernate.TransientObjectException: объект ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой
Я не понимаю, почему это происходит. Это дает мне эту ошибку, когда в коде есть некоторые запросы на родительском устройстве: сначала он становится пустым, а второй - имеет одно значение. Я использую weblogic 12.1.3 и hibernate 4.0.0, как базу данных Oracle 11g.
Если вы не скажете Hibernate на сохранение каскада, вы должны сохранить указанный экземпляр вручную перед рефериром. Так что спаси сына, потом папу, дедушку, а затем ГрандГрандПа. – markbernard
Это то, что я делаю. Рекурсивный метод переходит к сыну, выполняет все проверки и сохраняет его, затем возвращает папе, выполняет все проверки и сохраняет его и т. Д. До grandGrandPa, выполняет все проверки и сохраняет. Но, вероятно, я делаю что-то неправильно во время процесса. –