我在两个表User和Keyword之间有 ManyToMany 关系。用户是关系的所有者。如果我删除一个用户,我首先从这个用户中删除所有关键字,然后删除这个用户。这按预期工作。
但我不知道如何删除Keyword并自动删除与所有Users的关系。
到目前为止,这是我的代码。
@实体
@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,没有会话或会话已关闭
我用谷歌搜索并尝试了许多不同的东西,但没有任何效果。
我很感激任何帮助。
非常感谢你,
马可