Java 带Hibernate的ConstraintViolationException

Java 带Hibernate的ConstraintViolationException,java,spring,hibernate,spring-data-jpa,h2,Java,Spring,Hibernate,Spring Data Jpa,H2,从过去4个小时以来,我一直在与ConstraintViolationException(您在底部找到的完整异常的副本)进行斗争。我尝试了几种方法来摆脱,但我要么以新的异常结束,要么什么都没有改变。如果你能在这里帮助我,那就太好了 我在这里为您提供了一个我的实现模型,这样您就可以很容易地看到我的依赖关系。每个类都有每个字段的getter和setter以及@Entity、equals和hashcode。我只是把它们省略了 执行以下步骤后会出现问题: 应用程序启动 用不同的存储空间创建一些大老板 工

从过去4个小时以来,我一直在与ConstraintViolationException(您在底部找到的完整异常的副本)进行斗争。我尝试了几种方法来摆脱,但我要么以新的异常结束,要么什么都没有改变。如果你能在这里帮助我,那就太好了

我在这里为您提供了一个我的实现模型,这样您就可以很容易地看到我的依赖关系。每个类都有每个字段的getter和setter以及@Entity、equals和hashcode。我只是把它们省略了

执行以下步骤后会出现问题:

  • 应用程序启动
  • 用不同的存储空间创建一些大老板
  • 工人被创建并添加到每个大老板的列表中
  • 同时,在工人的CTOR中,创建一个机器人并接收对其工人的引用
  • 应用程序正在运行一段时间
  • 在BigBoss存储库中存储BigBoss
  • 应用程序终止
  • 应用程序重建
  • 从BigBoss存储中加载BigBoss
  • 调用bigBossRepository.deleteAll()
  • 应用程序运行
  • 在BigBoss存储库中存储BigBoss
  • 例外情况
简言之:在存储之后,删除并再次尝试在数据库中存储相同的大老板会导致异常。我需要这个删除和添加的过程,所以没有办法忽略这个异常。我只是穿春靴,冬眠和积垢

此外:如果我删除Robot和Worker之间的关系,并在每次重新运行过程中生成@Transient Robot,并在Worker的默认CTOR中创建一个新Robot,那么它就可以正常工作。所以问题一定是机器人和工人之间的关系

我的实施:

BigBossABC

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