【问题标题】:JPA / Hibernate - ConstraintViolationException by removing an elementJPA / Hibernate - ConstraintViolationException 通过删除元素
【发布时间】: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 集合中删除来删除它。

标签: java hibernate jpa


【解决方案1】:

我可以回答我的问题:我需要将 people 设置为 null:

p.setPersons(null);

一切都好。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多