【发布时间】:2010-10-15 20:28:56
【问题描述】:
我有一个带有连接表的 n:m 关系(项目 人)的 JPA/Hibernate 问题。该项目是映射所有者,并且具有 (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>();
【问题讨论】:
-
除了其他两个表的 FK 之外,连接表中是否还有其他内容?您可能需要发布表的休眠配置。
-
不,只有项目和人员的 ID。我更新了我的初始帖子并添加了注释。
-
这里的另一个解决方案不是建立双向关系,而是用
@Cascade(CascadeType.DELETE_ORPHAN)标记关系。然后,您可以通过将项目从Person中的projects集合中删除来删除它。