您的位置:首页 > 其它

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

2015-02-05 17:29 369 查看
我们在用户和角色的概念上经常要用到多对多关系本文综合全部情况统一进行说明

实现了的操作:

- 保存新增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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: