1. 程式人生 > >Hibernate ManytoMany 標註級聯增刪改查完整操作

Hibernate ManytoMany 標註級聯增刪改查完整操作

我們在使用者和角色的概念上經常要用到多對多關係本文綜合全部情況統一進行說明

實現了的操作:

- 儲存新增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>