作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建我的第一个 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/
我是一名优秀的程序员,十分优秀!