JPA + Hibernate:如何定义具有ON DELETE CASCADE的约束
我只是想知道是否有这样一种方法可以构建我的MySQL表格
ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`) ON DELETE CASCADE ON UPDATE CASCADE;
但是,当hibernate ++ jpa开始构建我的表时,我只在我的DDL中得到了这个“ ”
ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`);
在我的课程中,我有这些注释设置,
// UserAcc.java @Entity @Table(name = "USERACC") public class UserAcc implements Serializable { private static final long serialVersionUID = -5527566248002296042L; @Id @Column(name = "USERID") @GeneratedValue(strategy=GenerationType.AUTO) private Integer userId; @OneToOne(mappedBy = "userAcc") private UserInfo userInfo; .... public UserInfo getUserInfo() { return userInfo; } public void setUserInfo(UserInfo userInfo) { this.userInfo = userInfo; } ...
和,
// UserInfo.java @Entity @Table(name = "USERINFO") public class UserInfo implements Serializable { private static final long serialVersionUID = 5924361831551833717L; @Id @Column(name = "USERINFO_ID", nullable=false) @GeneratedValue(strategy=GenerationType.AUTO) private Integer userInfoId; @OneToOne(cascade = {CascadeType.ALL}) @JoinColumn(name="USERID", nullable=false) @ForeignKey(name = "FK_USER_ID") private UserAcc userAcc; public Integer getUserInfoId() { return userInfoId; } public void setUserInfoId(Integer userInfoId) { this.userInfoId = userInfoId; } ...
请注意,UserAccount表是此处的父/主表,而UserInfo是扩展表,规范化为另一个实体。 任何答案将不胜感激。 我很好奇它是如何完成的,因为我喜欢在MySQL中工作。 我只是真的习惯于从父表中删除一条记录(USERACOUNT),这也可以让我通过父/主表从子记录中依赖于特定记录来级联删除。
谢谢!
JPA确实提供了对关联实体进行级联操作(合并,持久,刷新,删除)的可能性。 逻辑在JPA中,不使用数据库级联。
@OneToMany(cascade=CascadeType.REMOVE)
没有符合JPA标准的方法来进行数据库级联的级联。 如果首选这样的级联,我们必须回退到Hibernate特定的构造: @OnDelete 。 它至少与@OneToMany一起使用,但过去曾经存在@OneToOne和@OnDelete的一些问题。
@OnDelete(action = OnDeleteAction.CASCADE)
在JPA中没有干净的切割手段。 以下内容将为您提供所需内容…您可以使用CascadeType.DELETE
,但此注释仅适用于EntityManager
的对象,而不适用于数据库。 您希望确保将ON DELETE CASCADE
添加到数据库约束中。 要进行validation,您可以配置JPA以生成ddl文件。 看一下ddl
文件,您会注意到ON DELETE CASCADE
不是约束的一部分。 将ON DELETE CASCADE
添加到ddl
文件中的实际SQL,然后从ddl更新数据库模式。 这将解决您的问题。
此链接显示如何在MySQL中使用ON DELETE CASCADE
for CONSTRAINT
。 您可以在约束上执行此操作。 您也可以在CREATE TABLE
或ALTER TABLE
语句中执行此操作。 JPA很可能在ALTER TABLE
语句中创建约束。 只需将ON DELETE CASCADE
添加到该语句即可。
请注意,某些JPA实现程序确实提供了此function的方法。
最后,Hibernate使用OnDelete(action = OnDeleteAction.CASCADE)
注释提供此function。
您可以在UserAcc.userInfo
上使用Hibernate注释org.hibernate.annotations@OnDelete(action = OnDeleteAction.CASCADE)
:
public class UserAcc implements Serializable { ... @OneToOne(mappedBy = "userAcc") @OnDelete(action = OnDeleteAction.CASCADE) private UserInfo userInfo; ...
这将在UserInfo
表中的外键上生成DDL ON DELETE CASCADE
。