【发布时间】:2013-05-24 21:44:02
【问题描述】:
我在 User 和 Keyword 这两个表之间存在多对多关系。用户是关系的所有者。如果我删除一个用户,我首先从这个用户中删除所有关键字,然后删除用户。这按预期工作。
但我不知道如何删除一个关键字并自动删除与所有用户的关系。
这是我目前的代码。
@实体 @Table(name = "用户") 公共类用户{ @ID @Column(name = "id") @GeneratedValue 私人整数 id; @Column(名称 = "名称") 私有字符串名称; @ManyToMany(级联 = CascadeType.ALL,获取 = FetchType.EAGER) @Fetch(值 = FetchMode.SUBSELECT) @JoinTable(name = "user_has_keyword", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "keyword_id")) 私有列表关键字 = new ArrayList(); // getter 和 setter ... } @实体 @Table(name = "关键字") 公共类关键字{ @ID @Column(name = "id") @GeneratedValue 私人整数 id; @Column(name = "关键字") 私有字符串关键字; @ManyToMany(mappedBy = "keywords") 私有列表用户 = new ArrayList(); // getter 和 setter ... } @Service("我的服务") @Transactional("事务管理器") 公共类我的服务{ @Resource(name = "sessionFactory") 私人 SessionFactory 会话工厂; @SuppressWarnings("未选中") 公共列表 getAllUsers() { 会话会话 = this.sessionFactory.getCurrentSession(); 查询查询 = session.createQuery("FROM User"); 返回查询.list(); } 公共用户getUser(整数id){ 会话会话 = this.sessionFactory.getCurrentSession(); return (User) session.get(User.class, id); } 公共无效添加用户(用户用户){ 会话会话 = this.sessionFactory.getCurrentSession(); 会话.保存(用户); } 公共无效删除用户(用户用户){ 会话会话 = this.sessionFactory.getCurrentSession(); // 1、删除关系 user.getKeywords().clear(); 会话.更新(用户); // 2、删除用户对象 会话.删除(用户); } 公共关键字getKeyword(整数id){ 会话会话 = this.sessionFactory.getCurrentSession(); return (Keyword) session.get(Keyword.class, id); } 公共关键字addKeyword(关键字关键字){ 会话会话 = this.sessionFactory.getCurrentSession(); session.save(关键字); 返回关键字; } 公共无效删除关键字(关键字关键字){ 会话会话 = this.sessionFactory.getCurrentSession(); // 1、删除关系 关键字.getUsers().clear(); session.update(关键字); // 2、删除用户对象 关键字 = getKeyword(keyword.getId()); session.delete(关键字); } } @控制器 公共类 MyController { @Resource(name = "我的服务") 私人的我的服务我的服务; @RequestMapping(value = "/add", method = RequestMethod.GET) 公共字符串添加(模型模型){ 关键字 k = new Keyword(); k.setKeyword("黄色"); k = myService.addKeyword(k); 用户 u1 = 新用户(); u1.setName("巴特"); u1.getKeywords().add(k); myService.addUser(u1); 用户 u2 = 新用户(); u2.setName("丽莎"); u2.getKeywords().add(k); myService.addUser(u2); 返回 ”/”; } @RequestMapping(value = "/delete/user", method = RequestMethod.GET) 公共字符串删除用户(模型模型){ 用户 u = myService.getUser(1); myService.deleteUser(u); 返回 ”/”; } @RequestMapping(value = "/delete/keyword", method = RequestMethod.GET) 公共字符串删除关键字(模型模型){ 关键字 k = myService.getKeyword(1); myService.deleteKeyword(k); 返回 ”/”; } }如果我浏览到 /delete/keyword,我会收到以下异常:
org.hibernate.LazyInitializationException:未能延迟初始化角色集合:com.blabla.prototype.Keyword.users,没有会话或会话已关闭我用谷歌搜索并尝试了许多不同的方法,但没有任何效果。
感谢您的帮助。
非常感谢,
马可
【问题讨论】: