есть сущность "адрес" и другая сущность "здание".По адресу может быть несколько зданий.
В building.java у меня есть адрес, определенный с помощью:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ADDRESS_ID_REF")
public Address getAddress() {
return this.address;
}
По адресу здание определяется как:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "address")
public Set<Building> getBuildings() {
return this.buildings;
}
При попытке сделать em.remove(building)
он работает
- нормально, когда есть только на здании по одному адресу
- плохо, когда есть два здания по одному адресу
Плохой случай построен точно так же, как хороший случай плюс вставка второго здания в базу данных со ссылкой на тот же адрес.
- вставка в значения адреса ('address123', [...]);
- вставить в значения здания ('building234', 'address123', [...]);
- вставить в значения здания ('building235', 'address123', [...]);
В плохом случае (hibernate не выполняет удаление) Я все еще могу удалить строку в базе данных (delete from building where building_id = '123'
). Нет ошибок SQL в отношении ссылок.
В аналогичных темах я читал, что в этом случае обычно остаются ссылки, такие как hibernate правильно не может удалить эту сущность.
К сожалению, я также не получаю никакого вывода log4j из спящего режима, и никаких исключений не происходит.Так что я не знаю, в чем проблема hibernate в этом месте.
Мои log4j.properties отлично работают для моих регистраторов.Выходы записываются, как ожидается, в консоль.Но я не получаю никаких журналов Hibernate.Я прочитал в другой ветке, что этот регистратор должен дать мне несколько советов: org.hibernate.event.internal.DefaultPersistEventListener
log4j.rootLogger=TRACE, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.category.com.myproject.mypackage=INFO
log4j.category.com.myproject.mypackage.myclass=DEBUG
log4j.category.org.hibernate.event.internal.DefaultPersistEventListener=TRACE
log4j.category.org.hibernate=TRACE
log4j.category.org.springframework=TRACE
При установке в persistence.xml show_sql значения true, я получу SQL, записанные в консоль,Там я вижу, что удаление sql не выполняется.Но я не вижу никаких ошибок.
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
Как написано в большинстве случаев в других темах, похоже, остались некоторые ссылки, которые нужно было удалить в первую очередь.Но в моем случае моя сущность - это дочерний объект, а это значит, что я не ожидаю, что посторонние лица, обращающиеся к зданию, будут проблемой.Кроме того, я могу удалить строительный ряд непосредственно через SqlDeveloper.И при изменении моего кода с
em.remove(building)
на
em.remove(address)
Все три объекта удаляются из-за каскадирования.Но это не то, чего я хочу, я хочу только удалить одно здание.Я думаю, чтобы получить его, мне нужно увидеть отсутствующие журналы гибернации (надеюсь, что они есть).
Если вам нужна дополнительная информация, пожалуйста, попросите их.Заранее спасибо.