JPA + Hibernate:如何定义具有ON DELETE CASCADE的约束

toy*_*toy 9 java mysql hibernate jpa cascade

我只是想知道是否有这样一种方法可以构建我的MySQL表格

ALTER TABLE `USERINFO`
  ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE;
Run Code Online (Sandbox Code Playgroud)

但是,当hibernate ++ jpa开始构建我的表时,我只在我的DDL中得到了这个<property name="hibernate.hbm2ddl.auto" value="create" />"

ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`);
Run Code Online (Sandbox Code Playgroud)

在我的课程中,我有这些注释设置,

// 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;
}
...
Run Code Online (Sandbox Code Playgroud)

和,

// 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;
}
...
Run Code Online (Sandbox Code Playgroud)

请注意,UserAccount表是此处的父/主表,而UserInfo是扩展表规范化到另一个实体.任何答案将不胜感激.我很好奇它是如何完成的,因为我喜欢在MySQL中工作.我只是真的习惯于从父表中删除一条记录(USERACOUNT),这也允许我通过父/主表的级别依赖于特定记录的子记录级联删除.

谢谢!

Mik*_*unu 9

JPA确实提供了对关联实体进行级联操作(合并,持久,刷新,删除)的可能性.逻辑在JPA中,不使用数据库级联.

@OneToMany(cascade=CascadeType.REMOVE)
Run Code Online (Sandbox Code Playgroud)

没有符合JPA标准的方法来进行数据库级联的级联.如果首选这样的级联,我们必须回退到Hibernate特定的构造:@OnDelete.它至少与@OneToMany一起使用,但过去曾经有过@OneToOne和@OnDelete的问题.

@OnDelete(action = OnDeleteAction.CASCADE)
Run Code Online (Sandbox Code Playgroud)


cmd*_*cmd 8

在JPA中没有干净的切割手段.以下内容将为您提供所需的...您可以使用CascadeType.DELETE,但此注释仅适用于EntityManager数据库中的对象,而不适用于数据库中的对象.您希望确保将ON DELETE CASCADE其添加到数据库约束中.要进行验证,您可以配置JPA以生成ddl文件.看一下这个ddl文件,你会发现ON DELETE CASCADE它不是约束的一部分.添加ON DELETE CASCADEddl文件中的实际SQL ,然后从ddl更新数据库架构.这将解决您的问题.

链接显示如何在MySQL中使用ON DELETE CASCADEon CONSTRAINT.您可以在约束上执行此操作.您也可以在CREATE TABLEALTER TABLE声明中执行此操作.JPA可能会在ALTER TABLE语句中创建约束.只需添加ON DELETE CASCADE到该声明中即可.

请注意,某些JPA实现者确实提供了此功能的方法.

最后,Hibernate使用OnDelete(action = OnDeleteAction.CASCADE)注释提供此功能.