Hibernate级联删除一对多调用SQL“;更新;而不是",;删除“;

Hibernate级联删除一对多调用SQL“;更新;而不是",;删除“;,hibernate,Hibernate,我定义了一个简单的父/子对象双向关系。我想执行级联删除,这样当父对象被删除时,所有子对象都会被删除,同时父对象会发出一个1 delete调用。以下是我的pojo类声明: @Entity @Table(name = "Agent_Assignment", schema = "xxx", catalog = "AAA") public class AgentAssignment { private Set<AgentAssignmentAttr> attributes = new

我定义了一个简单的父/子对象双向关系。我想执行级联删除,这样当父对象被删除时,所有子对象都会被删除,同时父对象会发出一个1 delete调用。以下是我的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;
    }
}
执行上述删除调用时,抛出异常:

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
基本上,当在Hibernate日志的SQL上执行日志时,它不会对它应该删除的Agent\u Assignment\u Attr表的行调用“update”,而是对该行调用“update”,以将外键列“Agent\u Assignment\u GUID”设置为null,如下所示:

/* 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]
/*删除一对多com.cs.mytime.acr.model.AgentAssignment.attributes*/update
MyTime.dbo.Agent\u Assignment\u Attr
设置
代理\u分配\u GUID=null
哪里
代理分配GUID=?
2014/08/22 16:31:10.430[跟踪](基本绑定:81)-绑定参数[1]为[VARCHAR]-[CA91A4F3-6F7E-4188-B299-8E9DF17F0385]

感谢任何人帮助我,看看我是否遗漏了什么,以及正确的解决方案。谢谢。

您的映射错误。双向关联只能定义关联映射一次的方式。这里有两个不同的、不相关的关联,它们恰好使用同一列。映射应该是

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

为了得到删除而不是更新,我必须使用这种方法:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", updatable = false)
private List<ChildEntity> children;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoving=true)
@JoinColumn(name=“PARENT\u ID”,referencedColumnName=“PARENT\u ID”,updateable=false)
私人名单儿童;

谢谢。我根据你所说的改变了它,但问题仍然存在。仍然调用“update”并抱怨将代理分配GUID设置为null,其中代理分配GUID的解释为D中不能为null。将
optional=false
添加到您的manytone注释中。实际上,我收回了前面的注释。Niset,当我把它改为:@OneToMany(mappedBy=“asgnmnt”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)启动服务器时引发以下异常:原因:org.hibernate.AnnotationException:mappedBy引用未知的目标实体属性:com.cs.mytime.acr.model.AgentAssignmentAttr.asgnmnt在com.cs.mytime.acr.model.AgentAssignment.attributes中我在回答中写了
mappedBy=“asgnmnt”
其中xxx应该等于子类AgentAssignmentAttr中父类的变量名,即“asgnmnt”,对吗?
@ManyToOne( fetch=FetchType.EAGER )
@JoinColumn(name="Agent_Assignment_GUID")
public AgentAssignment getAssignment() {
    return asgnmnt;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID", updatable = false)
private List<ChildEntity> children;