2016-12-19 5 views
0

У меня есть объект, который имеет два соотношение 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.

+0

Если вы не скажете Hibernate на сохранение каскада, вы должны сохранить указанный экземпляр вручную перед рефериром. Так что спаси сына, потом папу, дедушку, а затем ГрандГрандПа. – markbernard

+0

Это то, что я делаю. Рекурсивный метод переходит к сыну, выполняет все проверки и сохраняет его, затем возвращает папе, выполняет все проверки и сохраняет его и т. Д. До grandGrandPa, выполняет все проверки и сохраняет. Но, вероятно, я делаю что-то неправильно во время процесса. –

ответ

1

Это дает мне эту ошибку, когда в коде есть некоторые запросы на родительском устройстве

По умолчанию Hibernate будет вымывать ожидающие изменения в базу данных, прежде чем пытаться выполнить запрос. На этом этапе все объекты, на которые ссылаются в все отношения должны быть сохранены, иначе будет выбрано исключение.

Кроме того, поскольку mappedBy объявлен на конце children, parents является владением стороны отношений. Из-за этого Hibernate полностью игнорирует children и сохраняет временные объекты в parents. Поэтому ваша постоянная логика должна быть отменена - сначала сохраните родителей, потом детей (в качестве альтернативы вы можете просто объявить children владеющей стороной).

Смежные вопросы