gpt4 book ai didi

java - 参照完整性约束违规 : when deleting Entity in Hibernate (H2 in memory DBMS)

转载 作者:行者123 更新时间:2023-12-01 22:28:34 24 4
gpt4 key购买 nike

我正在构建我的第一个 Spring Boot 应用程序。我使用 Hibernate 和 H2 内存 DBMS。

我正在尝试构建一个代表多个应用商店的 REST API。我有一个名为“应用程序”的实体,另一个名为“商店”的实体。一个商店可以包含许多应用程序,每个应用程序可以包含在多个商店中。然而,应用程序不知道它们包含在哪些商店中。我希望能够独立删除应用程序和商店。仅仅因为商店被删除并不意味着其中的应用程序也应该被删除,反之亦然。应用程序可以不存在于商店中而存在,没有应用程序的商店也可以。

这是我的实体的代码,LpApp 是应用程序的实现,LpTemplate 是商店的实现:

@Entity
public class LpApp {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, updatable = false)
private Long id;

@NotBlank(message = "An app needs a non-empty name")
@Column(nullable = false, updatable = false, unique = true)
private String appName;

// ... constructors, getters, setters, no further annotations
}

@Entity
public class LpTemplate {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, updatable = false)
private Long id;

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name = "template_apps",
inverseJoinColumns = { @JoinColumn(name = "app_id") },
joinColumns = { @JoinColumn(name = "template_id") })
private Set<LpApp> apps = new HashSet<>();

// ... constructors, getters, setters, no further annotations

}

在我尝试从 DBMS 中删除应用程序或商店之前,这种方法效果很好。此时我得到一个 org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException。

我得到的异常如下(为了简洁起见,我修剪了调用堆栈):

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["APP_ID: PUBLIC.TEMPLATE_APPS FOREIGN KEY(APP_ID) REFERENCES PUBLIC.LP_APP(ID) (3)"; SQL statement:
delete from lp_app where id=? [23503-199]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
...
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
...
Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "APP_ID: PUBLIC.TEMPLATE_APPS FOREIGN KEY(APP_ID) REFERENCES PUBLIC.LP_APP(ID) (3)"; SQL statement:
delete from lp_app where id=? [23503-199]

我显然做错了什么,但我不知道去哪里看。我想我没有正确使用 @ManyToMany 注释,或者它对于我的用例来说可能是错误的注释。

非常感谢。

最佳答案

您需要添加级联属性来告诉hibernate不要在删除操作时删除实体。级联有不同的选项。引用this链接以了解不同的选项。

关于java - 参照完整性约束违规 : when deleting Entity in Hibernate (H2 in memory DBMS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58558380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com