【发布时间】:2019-06-05 14:32:15
【问题描述】:
我有一个有趣的“问题”,即现象。
快速信息:
-
_BaseEntity是一个@MappedSuperclass,它可以处理 ID、hashCode、equals、compareTo 等,并且在我的所有项目中都可以正常工作) - 我在 MySQL DB 上使用 Payara (EclipseLink)
-
@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()它。
.
示例不起作用:
但是如果是这样定义的
@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 端同样适用。
但出于兴趣:即使我设置了cascade = CascadeType.ALL 和orphanRemoval = true,为什么JPA 无法删除@JoinTable GP_Thema_topThema 中的条目?
更新:因为@JoinTable我也不能
- 先删除 TopThema,然后是 Thema(在 TopThema 删除时抛出 MySQLIntegrityConstraintViolationException)
- det Thema.topThema = null,然后更新(再次抛出MySQLIntegrityConstraintViolationException)
【问题讨论】:
-
您是否在
TopThema中定义了关联的反面?如果是这样,请同时发布该实体 -
不,这只是一方面。谢谢你的提示;-)
-
它能解决你的问题吗?
-
什么解决了这个问题?
-
你试过
@JoinTable( name = TABLE_NAME + "_topThema"", joinColumns = @JoinColumn(name = "topThema_ID"), inverseJoinColumns = @JoinColumn(name = "GP_TopThema") )吗?
标签: jpa jakarta-ee one-to-one jointable