Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA/Hibernate-通过删除元素来约束ViolationException_Java_Hibernate_Jpa - Fatal编程技术网

Java JPA/Hibernate-通过删除元素来约束ViolationException

Java JPA/Hibernate-通过删除元素来约束ViolationException,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个JPA/Hibernate问题,其中有一个连接表的n:m关系(projectperson)。该项目是映射所有者,具有(cascade=CascadeType.ALL) 现在我想删除一个与某人关联的项目,因此在project_Person join表中有一个条目,但是我得到了一个 org.hibernate.exception.ConstraintViolationException:无法执行JDBC批更新 因为在删除项目之前,不会删除Project_Person表的条目 以下是移除项目的

我有一个JPA/Hibernate问题,其中有一个连接表的n:m关系(projectperson)。该项目是映射所有者,具有(cascade=CascadeType.ALL)

现在我想删除一个与某人关联的项目,因此在project_Person join表中有一个条目,但是我得到了一个

org.hibernate.exception.ConstraintViolationException:无法执行JDBC批更新

因为在删除项目之前,不会删除Project_Person表的条目

以下是移除项目的方法:

public void removeProject(int projectId){
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session sess = sessionFactory.getCurrentSession();
    Transaction tx = sess.beginTransaction();
    try {
        Project p = (Project)sess.createQuery("from Project where id = "+projectId).list().get(0);
        sess.delete(p);
        tx.commit();
    }
    catch (IndexOutOfBoundsException ex) {System.out.println("exception: "+ex);}
}
一切都在事务内部,因此没有问题。但是为什么sess.selete(p)不能自动从联接表中删除条目呢

有人知道吗?向蒂姆问好

更新:

Person.java:

@ManyToMany(mappedBy=“persons”)
private Set projects=new HashSet();
Project.java:

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name=“项目\人员”,
joinColumns={@JoinColumn(name=“project\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“person\u id”,referencedColumnName=“id”)}
)
private Set persons=new HashSet();

我可以回答我的问题:我需要将人员设置为空:

p.setPersons(null);

一切正常。

我可以回答我的问题:我需要将人员设置为空:

p.setPersons(null);

一切正常。

除了FKs之外,联接表中还有其他两个表吗?您可能需要发布表的hibernate配置。不,只有project和person的ID。我更新了我的初始帖子并添加了注释。这里的另一个解决方案不是建立双向关系,而是用
@Cascade(CascadeType.DELETE\u ORPHAN)
标记这种关系。然后,您可以通过从
Person
中的
projects
集合中删除该项目来删除该项目。除了FKs之外,联接表中还有其他两个表吗?您可能需要发布表的hibernate配置。不,只有project和person的ID。我更新了我的初始帖子并添加了注释。这里的另一个解决方案不是建立双向关系,而是用
@Cascade(CascadeType.DELETE\u ORPHAN)
标记这种关系。然后,您可以通过将项目从
Person
中的
projects
集合中删除来删除该项目。
p.setPersons(null);