我有一个通用的用户/角色设置,带有一个user_role连接表。我试图使用Spring的HibernateTemplate来大规模删除所有锁定的用户,如下所示:
getHibernateTemplate().bulkUpdate("delete from User where locked=?", true);如果被删除的用户没有任何角色( user_role表中没有记录),那么一切都会好起来;但是,如果用户确实有一个角色记录,我将得到以下错误:
违反完整性约束-找到子记录
角色在User.java中定义如下:
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<Role>();那么,即使用户有子记录,我如何对删除用户进行批处理?谢谢!
发布于 2010-07-21 21:57:43
根据JPA规范,大容量删除操作不级联到相关实体:
4.10批量更新和删除操作 大容量更新和删除操作适用于单个实体类的实体(以及它的子类,如果有的话)。只能在FROM或UPDATE子句中指定一种实体抽象架构类型。 ..。 删除操作仅适用于指定类及其子类的实体。--它不级联到相关实体。
但是,我希望JPA提供程序能够处理连接表。遗憾的是,Hibernate没有,这是登录在HHH-1917中。恐怕您必须重新使用原生SQL来自己清理联接表,或者在模式中使用级联外键。
发布于 2009-04-09 18:05:59
应用程序级级联(通过hibernate注释或JPA注释级联)只有在实际从db加载实际实体时才能工作。当您在HQL中使用hibernate模板时,您会注意到实体没有加载,HQL被直接转换为要执行的SQL。
如果要批量删除,则必须在删除父表数据之前使用HQL查询删除所有相关表(即角色)。
发布于 2009-04-09 17:46:15
我不完全确定,因为我很难重新创建这个问题,但我认为您可能需要在@ManyToMany中添加一个级联
@ManyToMany(cascade = CascadeType.ALL)https://stackoverflow.com/questions/735201
复制相似问题