2010-10-15 165 views
1

我有一個連接表的n:m關係(項目< - >人)的JPA /休眠問題。該項目是映射所有者並具有(cascade = CascadeType.ALL)。JPA /休眠 - ConstraintViolationException通過刪除元素

現在我想刪除其與人相關聯的項目,所以在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>(); 
+0

連接表中除了FKs外還有其他兩個表嗎?您可能需要發佈您的表的休眠配置。 – 2010-10-15 10:36:09

+0

不,只有項目和人員的ID。我更新了我的初始帖子並添加了註釋。 – Tim 2010-10-15 10:46:39

+0

這裏的另一個解決方案不是建立雙向關係,而是用'@Cascade(CascadeType.DELETE_ORPHAN)'標記關係。然後,您可以通過從'Person'中的'projects'集合中刪除項目來移除該項目。 – 2012-04-10 15:14:16

回答

1

我可以回答我的問題:我需要設置人爲空:

p.setPersons(null); 

一切都沒問題。