Java 带Hibernate的ConstraintViolationException
从过去4个小时以来,我一直在与ConstraintViolationException(您在底部找到的完整异常的副本)进行斗争。我尝试了几种方法来摆脱,但我要么以新的异常结束,要么什么都没有改变。如果你能在这里帮助我,那就太好了 我在这里为您提供了一个我的实现模型,这样您就可以很容易地看到我的依赖关系。每个类都有每个字段的getter和setter以及@Entity、equals和hashcode。我只是把它们省略了 执行以下步骤后会出现问题:Java 带Hibernate的ConstraintViolationException,java,spring,hibernate,spring-data-jpa,h2,Java,Spring,Hibernate,Spring Data Jpa,H2,从过去4个小时以来,我一直在与ConstraintViolationException(您在底部找到的完整异常的副本)进行斗争。我尝试了几种方法来摆脱,但我要么以新的异常结束,要么什么都没有改变。如果你能在这里帮助我,那就太好了 我在这里为您提供了一个我的实现模型,这样您就可以很容易地看到我的依赖关系。每个类都有每个字段的getter和setter以及@Entity、equals和hashcode。我只是把它们省略了 执行以下步骤后会出现问题: 应用程序启动 用不同的存储空间创建一些大老板 工
- 应用程序启动
- 用不同的存储空间创建一些大老板
- 工人被创建并添加到每个大老板的列表中李>
- 同时,在工人的CTOR中,创建一个机器人并接收对其工人的引用
- 应用程序正在运行一段时间
- 在BigBoss存储库中存储BigBoss
- 应用程序终止
- 应用程序重建
- 从BigBoss存储中加载BigBoss
- 调用bigBossRepository.deleteAll()
- 应用程序运行
- 在BigBoss存储库中存储BigBoss
- 例外情况
public abstract class BigBossABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long bigBossABC_id;
@OneToMany(mappedBy = "bigBossAbc", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<WorkerABC> workerABCList = new LinkedList<>();
@OneToOne(cascade = CascadeType.ALL)
private Storage storage;
//default CTOR
public BigBossABC() {
}
public BigBossABC(Storage storage) {
this.storage = storage;
}
}
public class BigBoss extends BigBossABC{
public BigBoss(Storage storage) {
super(storage);
}
}
public abstract class WorkerABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long workerabc_id;
@ManyToOne(cascade = CascadeType.ALL)
BigBossABC bigBossAbc;
public WorkerABC(BigBossABC bigBossABC) {
this.bigBossABC = bigBossABC;
}
//default CTOR
public WorkerABC() {
}
}
public class Worker extends WorkerABC {
@OneToOne(cascade = CascadeType.ALL)
Robot robot;
public Worker(BigBossABC bigBossABC) {
super(bigBossABC);
this.robot = new Robot(this);
}
//default CTOR
public Worker() {
}
}
public class Robot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long robot_id;
@OneToOne
Worker workerImpl;
public Robot(Worker workerImpl) {
this.workerImpl = workerImpl;
}
//default CTOR
public Robot() {
}
}
public class Storage {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long storage_id;
//default CTOR
public Storage() {
}
}
@Repository
public interface BigBossRepo extends CrudRepository<BigBossABC, Long> {
}
可操作性c
public abstract class BigBossABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long bigBossABC_id;
@OneToMany(mappedBy = "bigBossAbc", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<WorkerABC> workerABCList = new LinkedList<>();
@OneToOne(cascade = CascadeType.ALL)
private Storage storage;
//default CTOR
public BigBossABC() {
}
public BigBossABC(Storage storage) {
this.storage = storage;
}
}
public class BigBoss extends BigBossABC{
public BigBoss(Storage storage) {
super(storage);
}
}
public abstract class WorkerABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long workerabc_id;
@ManyToOne(cascade = CascadeType.ALL)
BigBossABC bigBossAbc;
public WorkerABC(BigBossABC bigBossABC) {
this.bigBossABC = bigBossABC;
}
//default CTOR
public WorkerABC() {
}
}
public class Worker extends WorkerABC {
@OneToOne(cascade = CascadeType.ALL)
Robot robot;
public Worker(BigBossABC bigBossABC) {
super(bigBossABC);
this.robot = new Robot(this);
}
//default CTOR
public Worker() {
}
}
public class Robot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long robot_id;
@OneToOne
Worker workerImpl;
public Robot(Worker workerImpl) {
this.workerImpl = workerImpl;
}
//default CTOR
public Robot() {
}
}
public class Storage {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long storage_id;
//default CTOR
public Storage() {
}
}
@Repository
public interface BigBossRepo extends CrudRepository<BigBossABC, Long> {
}
工人
public abstract class BigBossABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long bigBossABC_id;
@OneToMany(mappedBy = "bigBossAbc", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<WorkerABC> workerABCList = new LinkedList<>();
@OneToOne(cascade = CascadeType.ALL)
private Storage storage;
//default CTOR
public BigBossABC() {
}
public BigBossABC(Storage storage) {
this.storage = storage;
}
}
public class BigBoss extends BigBossABC{
public BigBoss(Storage storage) {
super(storage);
}
}
public abstract class WorkerABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long workerabc_id;
@ManyToOne(cascade = CascadeType.ALL)
BigBossABC bigBossAbc;
public WorkerABC(BigBossABC bigBossABC) {
this.bigBossABC = bigBossABC;
}
//default CTOR
public WorkerABC() {
}
}
public class Worker extends WorkerABC {
@OneToOne(cascade = CascadeType.ALL)
Robot robot;
public Worker(BigBossABC bigBossABC) {
super(bigBossABC);
this.robot = new Robot(this);
}
//default CTOR
public Worker() {
}
}
public class Robot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long robot_id;
@OneToOne
Worker workerImpl;
public Robot(Worker workerImpl) {
this.workerImpl = workerImpl;
}
//default CTOR
public Robot() {
}
}
public class Storage {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long storage_id;
//default CTOR
public Storage() {
}
}
@Repository
public interface BigBossRepo extends CrudRepository<BigBossABC, Long> {
}
机器人
public abstract class BigBossABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long bigBossABC_id;
@OneToMany(mappedBy = "bigBossAbc", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<WorkerABC> workerABCList = new LinkedList<>();
@OneToOne(cascade = CascadeType.ALL)
private Storage storage;
//default CTOR
public BigBossABC() {
}
public BigBossABC(Storage storage) {
this.storage = storage;
}
}
public class BigBoss extends BigBossABC{
public BigBoss(Storage storage) {
super(storage);
}
}
public abstract class WorkerABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long workerabc_id;
@ManyToOne(cascade = CascadeType.ALL)
BigBossABC bigBossAbc;
public WorkerABC(BigBossABC bigBossABC) {
this.bigBossABC = bigBossABC;
}
//default CTOR
public WorkerABC() {
}
}
public class Worker extends WorkerABC {
@OneToOne(cascade = CascadeType.ALL)
Robot robot;
public Worker(BigBossABC bigBossABC) {
super(bigBossABC);
this.robot = new Robot(this);
}
//default CTOR
public Worker() {
}
}
public class Robot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long robot_id;
@OneToOne
Worker workerImpl;
public Robot(Worker workerImpl) {
this.workerImpl = workerImpl;
}
//default CTOR
public Robot() {
}
}
public class Storage {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long storage_id;
//default CTOR
public Storage() {
}
}
@Repository
public interface BigBossRepo extends CrudRepository<BigBossABC, Long> {
}
存储
public abstract class BigBossABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long bigBossABC_id;
@OneToMany(mappedBy = "bigBossAbc", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<WorkerABC> workerABCList = new LinkedList<>();
@OneToOne(cascade = CascadeType.ALL)
private Storage storage;
//default CTOR
public BigBossABC() {
}
public BigBossABC(Storage storage) {
this.storage = storage;
}
}
public class BigBoss extends BigBossABC{
public BigBoss(Storage storage) {
super(storage);
}
}
public abstract class WorkerABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long workerabc_id;
@ManyToOne(cascade = CascadeType.ALL)
BigBossABC bigBossAbc;
public WorkerABC(BigBossABC bigBossABC) {
this.bigBossABC = bigBossABC;
}
//default CTOR
public WorkerABC() {
}
}
public class Worker extends WorkerABC {
@OneToOne(cascade = CascadeType.ALL)
Robot robot;
public Worker(BigBossABC bigBossABC) {
super(bigBossABC);
this.robot = new Robot(this);
}
//default CTOR
public Worker() {
}
}
public class Robot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long robot_id;
@OneToOne
Worker workerImpl;
public Robot(Worker workerImpl) {
this.workerImpl = workerImpl;
}
//default CTOR
public Robot() {
}
}
public class Storage {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long storage_id;
//default CTOR
public Storage() {
}
}
@Repository
public interface BigBossRepo extends CrudRepository<BigBossABC, Long> {
}
BigBossRepo
public abstract class BigBossABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long bigBossABC_id;
@OneToMany(mappedBy = "bigBossAbc", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<WorkerABC> workerABCList = new LinkedList<>();
@OneToOne(cascade = CascadeType.ALL)
private Storage storage;
//default CTOR
public BigBossABC() {
}
public BigBossABC(Storage storage) {
this.storage = storage;
}
}
public class BigBoss extends BigBossABC{
public BigBoss(Storage storage) {
super(storage);
}
}
public abstract class WorkerABC {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long workerabc_id;
@ManyToOne(cascade = CascadeType.ALL)
BigBossABC bigBossAbc;
public WorkerABC(BigBossABC bigBossABC) {
this.bigBossABC = bigBossABC;
}
//default CTOR
public WorkerABC() {
}
}
public class Worker extends WorkerABC {
@OneToOne(cascade = CascadeType.ALL)
Robot robot;
public Worker(BigBossABC bigBossABC) {
super(bigBossABC);
this.robot = new Robot(this);
}
//default CTOR
public Worker() {
}
}
public class Robot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long robot_id;
@OneToOne
Worker workerImpl;
public Robot(Worker workerImpl) {
this.workerImpl = workerImpl;
}
//default CTOR
public Robot() {
}
}
public class Storage {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long storage_id;
//default CTOR
public Storage() {
}
}
@Repository
public interface BigBossRepo extends CrudRepository<BigBossABC, Long> {
}
应用程序属性
spring.datasource.url=jdbc:h2:file:~/test2;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE
spring.datasource.username=admin
spring.datasource.password=password
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
你允许复制吗?如果存在重复项,则会出现此问题。此外,删除时是否删除整个关系链? 因为当您尝试添加next时,在相关表中不应该看到任何重复项。
Hibernate不会处理重复项,您需要使用代码处理它,处理重复项/处理异常 您允许复制吗?如果存在重复项,则会出现此问题。此外,删除时是否删除整个关系链?
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
因为当您尝试添加next时,在相关表中不应该看到任何重复项。
Hibernate不会处理重复项,您需要使用代码处理它,处理重复项/处理异常
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
如果将此注释添加到测试类中,则h2数据库将在每次测试之前重置。我也有同样的问题,这帮我解决了。我得到了ConstraintViolationExceptions,这些值当时甚至不应该在数据库中,所以我确保它们没有
如果将此注释添加到测试类中,则h2数据库将在每次测试之前重置。我也有同样的问题,这帮我解决了。我得到的ConstraintViolationExceptions值当时甚至不应该在数据库中,因此我确保它们不存在。您好,谢谢您的回答。因为我在存储库中调用deleteAll,所以实际上我希望所有内容都被删除。Crudepository的文档是这么说的。嗨,谢谢你的回答。因为我在存储库中调用deleteAll,所以实际上我希望所有内容都被删除。Crudepository的文档是这样说的。您使用的是哪一版本的spring?SpringBoot 1.5.3I正在考虑,但是您的spring版本有修复程序。将
孤立删除=true
添加到@OneToOne
孤立是默认值true。对我来说似乎是false/***(可选)是否将删除操作应用于从关系中删除的*实体,并将删除操作级联到*这些实体。*@由于Java Persistence 2.0*/boolean孤儿移除()默认值为false代码>您使用的是哪一版本的spring?SpringBoot 1.5.3I正在考虑,但是您的spring版本有修复程序。将孤立删除=true
添加到@OneToOne
孤立是默认值true。对我来说似乎是false/***(可选)是否将删除操作应用于从关系中删除的*实体,并将删除操作级联到*这些实体。*@由于Java Persistence 2.0*/boolean孤儿移除()默认值为false代码>