Hibernate ManytoMany 标注级联增删改查完整操作

来源:互联网 发布:单身狗 知乎 编辑:程序博客网 时间:2024/06/16 08:47

我们在用户和角色的概念上经常要用到多对多关系本文综合全部情况统一进行说明

实现了的操作:

- 保存新增User用户的时候保存新的Role

- 新增User用户绑定已有Role后保存关系

- 删除用户时删除跟角色的对应关系

- 只有角色没有对应任何用户的时候才能删除角色

 

1. 类注解

User类

@ManyToMany(cascade={CascadeType.MERGE}) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))    private Set<Role> roles =new HashSet<Role>();@ManyToMany(mappedBy="roles")    public Set<User> users;


说明:级联操作必须使用MERGE, 同时在保存中使用Session.merge. 否则操作中的第二条不能完成。会出现如下错误

session.saveOrUpdate(session.merge(user));org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.***; 


2. DAO

public void addUser(User user) {    System.out.println("-------getinto UserDao--------");    session=sessionFactory.getCurrentSession();    //session.saveOrUpdate(session.merge(user));    session.merge(user);}public void deleteUserById(int userID) {    session=sessionFactory.getCurrentSession();    User user=(User) session.get(User.class, userID);    session.delete(user);}public void deleteRolebyId(int id) {    session=sessionFactory.getCurrentSession();        Role role=(Role) session.get(Role.class, id);    session.delete(role);}

另外,因为没有实现级联操作,需要在web.xml中使用OpenSessionInView

<!-- Open Seesion in View -->

<filter><filter-name>openSessionInView</filter-name><filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class></filter><filter-mapping><filter-name>openSessionInView</filter-name><url-pattern>/*</url-pattern></filter-mapping>


0 0
原创粉丝点击