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>();
连接表中除了FKs外还有其他两个表吗?您可能需要发布您的表的休眠配置。 – 2010-10-15 10:36:09
不,只有项目和人员的ID。我更新了我的初始帖子并添加了注释。 – Tim 2010-10-15 10:46:39
这里的另一个解决方案不是建立双向关系,而是用'@Cascade(CascadeType.DELETE_ORPHAN)'标记关系。然后,您可以通过从'Person'中的'projects'集合中删除项目来移除该项目。 – 2012-04-10 15:14:16