当前位置: 首页 > 知识库问答 >
问题:

JPA+Hibernate:如何定义DELETE级联上的约束

董奇思
2023-03-14

我只是想知道是否有这样一种方法,我可以将我的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;
}
...

共有1个答案

万俟丁雷
2023-03-14

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

@OneToMany(cascade=CascadeType.REMOVE)

没有符合JPA标准的方法来使用数据库级联进行级联。如果首选这样的级联,我们必须返回到Hibernate特定的构造:@ondelete。它至少可以与@onetomany一起使用,但是过去与@onetoone@ondelete一起使用时存在一些问题。

@OnDelete(action = OnDeleteAction.CASCADE)

请注意,将此注释添加到现有约束不会更新它。您可能必须首先手动删除它才能正确更新架构

 类似资料:
  • 我有以下问题:当我试图删除一个具有以下关系的实体时: 对于,它通过提供的delete方法删除实体及其所有可收费元素,这很好。当我尝试使用自定义删除时,会出现问题: 上面写着: 为什么不允许我这么做?方法不支持级联属性吗?我知道我可以先,然后用标准的delete方法删除持久实体,但这是不优雅的。是否可以像我尝试的那样使用自定义的方法?

  • 问题内容: 我正在使用JPA 2.0并hibernate。我有一个用户类和一个组类,如下所示: 然后,我创建一个用户和组,然后将该用户分配给该组。 我要拥有的是删除组时(当然),该组将被删除,并且该组具有的所有用户-组关系将从USER_GROUP连接表中自动删除,但用户本身不会从USER表。 使用上面的代码,当我删除组时,只有GROUP表中的行将被删除,并且用户在USER_GROUP连接表中仍然具

  • 问题内容: 我有两个类A和B。许多B可以与一个A关联,因此从B到A是多对一的关系。我已经将这种关系映射为: A没有映射到B。记住这一点,我们打算在删除与A关联的B时将其删除。如果我可以在B中的多对一关联中定义inverse =“ true”,但hibernate则不允许这样做,这是可能的。 有人能帮忙吗?我们不想为此在A中写任何东西。 问题答案: hibernate仅沿着定义的关联进行级联。如果A

  • 问题内容: 我有一个实体: 和一个实体: Hibernate在foo.bar-> bar.id上创建外键约束,但未指定。为什么不?并且有什么方法可以实现? 或者,我可以在数据库中手动添加(并禁用DDL生成), 这是一个好习惯吗? 而且,我是否必须以某种方式修改代码以让Hibernate知道相关记录已被数据库自动删除? 谢谢。 更新 -这是我的JPA / Hibernate / PostgreSQL

  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

  • 我使用的是Hibernate的JPA实现。我有一个包含不同类型用户(私有、公共等)的用户表,user_type列指定用户的类型。 我有一个User类,它是一个表示User表的实体。我补充说 在我的用户类上创建了两个类,PrivateUser和PublicUser,它们都用相应的@DiscriminatorValue扩展了用户类。 如果我的解释不清楚,请让我知道。 提前致谢