hibernate 一对多 级联delete

wwwcomcn123 2013-05-15 10:47:52

@Entity
@Table(name="u_group")
public class Group {

private int id;
private String name;
private int age;
private Set<User> users=new HashSet<User>();

@Id
@GeneratedValue
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@OneToMany
@Cascade(value={CascadeType.DELETE})
public Set<User> getUsers() {
return users;
}

public void setUsers(Set<User> users) {
this.users = users;
}


}




@Entity
public class User {

private int id;
private String name;

@Id
@GeneratedValue
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}


}

@Test
public void testGroup_User(){
Group g=new Group();
g.setId(3);

Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
session.delete(g);
session.getTransaction().commit();

}


Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`hibernate/user`, CONSTRAINT `FK285FEB5156FC9E` FOREIGN KEY (`group_id`) REFERENCES `u_group` (`id`))
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 28 more
...全文
544 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2013-05-17
  • 打赏
  • 举报
回复
引用 49 楼 wwwcomcn123 的回复:
本来被这个伤到了的,不想再想了。但看了一些意见去试了下天又发现了奇怪的事,我感觉没怎么改,但都成功了,怎么试怎么成功,以前试了好多方法都失败,现在都成功了!以至于我现在都不知道我当时是怎么错的?? 48楼说的应该可行我没试,因为可以直接delete(g)级联删除对应的user。 谢谢楼上给位,问题解决,结贴!
没怎么改?不会吧
dracularking 2013-05-17
  • 打赏
  • 举报
回复
整理了一下思路,one2many的级联删除按正常情况是可以的,hibernate级联删除时会自动将one方对many方的外键设为null,但如果one方的外键声明为非null的话,就无法级联删除,就会报a foreign key constraint fails这种错误 此时的一种解决方法是设置inverse="true"并改为双向关联,这在Hibernate文档中有相应的描述: Very Important Note: If the <key> column of a <one-to-many> association is declared NOT NULL, Hibernate may cause constraint violations when it creates or updates the association. To prevent this problem, you must use a bidirectional association with the many valued end (the set or bag) marked as inverse="true".
a82759082 2013-05-17
  • 打赏
  • 举报
回复
user是维护端,删除之前先把group置为空就ok了,以下是伪代码 Group group=session.get(id); //(id为groupid) for(User user:group.getUsers()){ user.setGroup(null); } session.delete(group);
老伯⭐️ 2013-05-17
  • 打赏
  • 举报
回复
解决固然好 关键 整明白了
wwwcomcn123 2013-05-17
  • 打赏
  • 举报
回复
本来被这个伤到了的,不想再想了。但看了一些意见去试了下天又发现了奇怪的事,我感觉没怎么改,但都成功了,怎么试怎么成功,以前试了好多方法都失败,现在都成功了!以至于我现在都不知道我当时是怎么错的?? 48楼说的应该可行我没试,因为可以直接delete(g)级联删除对应的user。 谢谢楼上给位,问题解决,结贴!
老伯⭐️ 2013-05-17
  • 打赏
  • 举报
回复
上面说的什么啊 好多啊 一对多单向就单向喽 首先 你的那个Group g=new Group(); g.setId(3);这哥们 是瞬时态 楼主是想根据 Id 删除某个group 还是里面的人也删除 要是删除 group 人留着 就 下边 Group g=session.get(Group.class;"3"); 得到持久态 Set<User> set=g.getSet(); 得到里面所有的用户 循环用户 的到每一个用户 user user.setGroup(null); 断掉关系 然后 session.delete(g); 删除 group 如果要里面的user 全部删掉 就把取出来的 user session.delete(user); 级联关闭 手动先删掉关系 在删掉多的一方
wwwcomcn123 2013-05-17
  • 打赏
  • 举报
回复
引用 44 楼 houpengfei111 的回复:
lz 都没有指定 多的一方的外键是那个字段,应该在User里加上@ManyToone标签并加上Group对象的引用
我要求一对多单向关联
wwwcomcn123 2013-05-17
  • 打赏
  • 举报
回复
引用 41 楼 a82759082 的回复:
user是维护端,删除之前先把group置为空就ok了,以下是伪代码 Group group=session.get(id); //(id为groupid) for(User user:group.getUsers()){ user.setGroup(null); } session.delete(group);
是个思路,我试试
wwwcomcn123 2013-05-17
  • 打赏
  • 举报
回复
引用 42 楼 zjlolife 的回复:
你去我博客上看,上面有一些总结,一对多关系的例子有好多……总之,学东西得慢慢来,你得弄清楚cascade与inverse,否则你永远也弄不清楚这里面的原理。
这不是纠结不纠结的问题,我只会Annotation,xml 不会!网上的确有很多例子,但大多都是xml的,Annotation的试了又错
小菜鸟的博客 2013-05-17
  • 打赏
  • 举报
回复
lz 都没有指定 多的一方的外键是那个字段,应该在User里加上@ManyToone标签并加上Group对象的引用
zjlolife 2013-05-17
  • 打赏
  • 举报
回复
引用 40 楼 wwwcomcn123 的回复:
我是Annotation写的,谁能直接给个例子什么的,一对多单向关联级联删除!!! 网上好多都是xml配置文件写的,38楼的说的是xml配置文件里面的吧?
你为什么要纠结是用annation还是xml这两个根本就没区别,你太纠结了……
zjlolife 2013-05-17
  • 打赏
  • 举报
回复
你去我博客上看,上面有一些总结,一对多关系的例子有好多……总之,学东西得慢慢来,你得弄清楚cascade与inverse,否则你永远也弄不清楚这里面的原理。
wwwcomcn123 2013-05-16
  • 打赏
  • 举报
回复
OneToMany中有inverse属性吗,我怎么没找到???
wwwcomcn123 2013-05-16
  • 打赏
  • 举报
回复
唉 大家晚安吧!!!!
wwwcomcn123 2013-05-16
  • 打赏
  • 举报
回复
双向我刚开始就对了,单向从开始错到现在,在网上找了很多注解,试了很多,上面并不是我双向的注解,在网上找的注解。
q35335010 2013-05-16
  • 打赏
  • 举报
回复
好吧,我觉得你是累了,明天再搞吧,现在才醒悟
wwwcomcn123 2013-05-16
  • 打赏
  • 举报
回复
哦!!!!原来一直都是我描述错了。真是对不住各位,我想问的就是一对多单向和双向。毕竟一对多用得蛮多的。抱歉啊,真失误!!!
q35335010 2013-05-16
  • 打赏
  • 举报
回复
多对多是要中间表的,用注解是@ManyToMany 我这个是1对多的双向
wwwcomcn123 2013-05-16
  • 打赏
  • 举报
回复
多对多我成功了! 在网上看了好多文章,差不多都是这样,一对多和多对多在数据库的表现是一样的,只是java中有点不一样!!!
q35335010 2013-05-16
  • 打赏
  • 举报
回复
这个是一对多双向
加载更多回复(32)
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关 1.3.3. 使关工作 1.3.4. 值类型的集合 1.3.5. 双向关 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5

67,518

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧