当前位置: 首页 > 知识库问答 >
问题:

Hibernate级联删除用于一对多调用SQL“update”而不是“delete”

卫才哲
2023-03-14

我有一个简单的父母/孩子obj双向关系定义。我想执行级联删除,这样当删除父级时,所有的子级也将通过一个1删除调用从父级删除。以下是我的pojo类声明:

@Entity
@Table(name = "Agent_Assignment", schema = "xxx", catalog = "AAA")
public class AgentAssignment {
    private Set<AgentAssignmentAttr> attributes = new HashSet<AgentAssignmentAttr>();

    @OneToMany( fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true )
    @JoinColumn(name="Agent_Assignment_GUID")
    public Set<AgentAssignmentAttr> getAttributes() {
        return attributes;
    }

    public void setAttributes(Set<AgentAssignmentAttr> attributes) {
        this.attributes = attributes;
    }

}

@Entity
@Table(name = "Agent_Assignment_Attr", schema = "xxx", catalog = "AAA")
public class AgentAssignmentAttr {
    private AgentAssignment asgnmnt = null;

    @ManyToOne( fetch=FetchType.EAGER )
    @JoinColumn(name="Agent_Assignment_GUID", insertable=false, updatable=false)
    public AgentAssignment getAssignment() {
        return asgnmnt;
    }

    public void setAssignment(AgentAssignment assignment) {
        this.asgnmnt = assignment;
    }
}
AgentAssignment assgnmnt = (...some HQL query to returns the AgentAssignment obj)
getSession().delete(assgnmnt);
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
/* delete one-to-many com.cs.mytime.acr.model.AgentAssignment.attributes */ update
        MyTime.dbo.Agent_Assignment_Attr 
    set
        Agent_Assignment_GUID=null 
    where
        Agent_Assignment_GUID=?
2014/08/22 16:31:10.430 [TRACE] <http-bio-8080-exec-5> (BasicBinder.bind:81) - binding parameter [1] as [VARCHAR] - [CA91A4F3-6F7E-4188-B299-8E9DF17F0385]

感谢任何人的帮助,看看是否有什么我错过了和正确的解决方案。谢了。

共有1个答案

公良鸿禧
2023-03-14

你的地图错了。双向关联只能定义一次关联的映射方式。你有两个不同的,不相关的关联碰巧使用相同的列。映射应该是

@OneToMany(mappedBy="assignment", fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true )
public Set<AgentAssignmentAttr> getAttributes() {
    return attributes;
}

其中Mappedby表示:“我是在AgentAssignmentAttr.Assignment上定义和映射的双向关联的反面,并且

@ManyToOne( fetch=FetchType.EAGER )
@JoinColumn(name="Agent_Assignment_GUID")
public AgentAssignment getAssignment() {
    return asgnmnt;
}
 类似资料:
  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它会在-预期行为中创建新的行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hib

  • 使用Spring Boot 1.4.0和MySql 5.7 我有两个table并且它是单向的@manytomany,但是在角色的父端,我想删除权限hibernate会自动删除它自己和link-table记录: > 权限

  • 问题内容: 我对级联=“删除”的工作方式感到困惑。我在“城市”映射文件中以以下方式定义了映射: 类客户具有类城市的外键。 因此,当我运行时: 是否还应该删除所有客户端,还是必须以某种方式处理它?我是否将查询作为方法参数正确传递给会话的delete()方法?谢谢你的帮助。最好的问候,混蛋。 问题答案: 我对cascade =“ delete”的工作方式有些困惑(…) 级联操作意味着,如果您是父母,则

  • 我无法使用Hibernate JPA嵌入使cascase删除在Java EE容器管理的应用程序中工作。我们将不胜感激。我有一个实体‘公司',与其他实体有四个任何关系。当测试应用程序(使用Arquillian框架)时,我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。我读到了这里:JPA和Hibernate Cascade DELETE OneToMany不起作用,这可能是一个测试问题,所

  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它将在-预期行为中再次创建新行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hi

  • 我一直在阅读一篇又一篇的帖子和文章,试图让级联删除在最新的Spring Boot版本中与JPA/Hibernate配合使用。我读过你必须使用Hibernate特定的级联,我读过你不需要。我读过它们就是不起作用,但它似乎是一个混合体。我尝试过的一切都不起作用。这种关系是双向的。 不工作: 不工作: 在删除品牌之前,除了删除税率之外,还有什么其他方法有效吗? 我的测试如下所示: 参考错误: 原因:or