У меня есть забавная «проблема», то есть явление.
Краткая информация:
_BaseEntity
- это @MappedSuperclass
, который обрабатывает ID, hashCode, equals, CompareTo и т. Д. И отлично работает во всех моих проектах)
- Я использую Payara (EclipseLink) на БД MySQL
@Expose
- это тег GSON
- Я нашел много похожих тем, но ни один из них не ответил на мой вопрос, не сделал различий с / без
@JoinTable
, или не получил ответ в виде решения ...
- отношение является односторонним, то есть только с
Thema->TopThema
, и явно НЕТ TopThema->Thema
ПРИМЕР РАБОТЫ
Когда у меня есть сущность, настроенная так:
@Entity
@Table(name = Thema.TABLE_NAME)
public class Thema extends _BaseEntity {
static public final String TABLE_NAME = UEntity.TABLE_PREFIX + "Thema";
@Expose @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private TopThema topThema;
}
Я могу просто EntityManager.remove () it.
.
ПРИМЕР НЕ РАБОТАЕТ :
Но , если это определено так
@Entity
@Table(name = Thema.TABLE_NAME)
public class Thema extends _BaseEntity {
static public final String TABLE_NAME = UEntity.TABLE_PREFIX + "Thema";
@Expose @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinTable(name = TABLE_NAME + "_topThema")
private TopThema topThema;
}
(с промежуточной таблицей "GP_Thema_topThema", как определено @JoinTable(name = TABLE_NAME + "_topThema")
затем EntityManager.remove () выдает исключение:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено
(test_PT_local
. GP_Thema_topThema
, ОГРАНИЧЕНИЕ
FK_GP_Thema_topThema_topThema_ID
ИНОСТРАННЫЙ КЛЮЧ (topThema_ID
)
ССЫЛКИ GP_TopThema
(ID
))
Я знаю, что не имеет особого смысла использовать дополнительные @JoinTable
, когда ссылка также может быть просто сохранена внутри "GP_Thema" как "GP_Thema". 'TOPTHEMA_ID'.
Плюс: оба определения сущностей одинаково хорошо работают на стороне Java.
Но из интереса: почему JPA не может удалить запись в @JoinTable
GP_Thema_topThema
, хотя я установил cascade = CascadeType.ALL
и orphanRemoval = true
?
Обновление: А из-за @JoinTable
я тоже не могу
- сначала удалите TopThema, затем Thema (выбрасывает MySQLIntegrityConstraintViolationException
при удалении TopThema)
- det Thema.topThema = null, затем обновить (снова выбрасывает MySQLIntegrityConstraintViolationException
)