JPA / Hibernate - 通过删除元素的ConstraintViolationException

时间:2010-10-15 09:28:15

标签: java hibernate jpa

我有一个带有连接表的n:m关系(Project< - > Person)的JPA / Hibernate问题。 Project是映射所有者,并且具有(cascade = CascadeType.ALL)。

现在我想删除一个与Person关联的项目,所以Project_Person连接表中有一个条目,但是我得到了一个

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

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

以下是 removeProject方法

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<Project> projects = new HashSet<Project>();

Project.java:

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "Project_Person",
    joinColumns = {@JoinColumn(name="project_id", referencedColumnName="id")},
    inverseJoinColumns = {@JoinColumn(name="person_id", referencedColumnName="id")}
)
private Set<Person> persons = new HashSet<Person>();

1 个答案:

答案 0 :(得分:1)

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

p.setPersons(null);

一切都很好。