Post的操作:崗位:持久化對象,如果要修改也是需要放在事務中,否則也不會進行更新;
---
用户是一對多,多對多的集合;
三張表;
如果是多張表,解決方案是:使用VO,BO,展示信息需要轉化為界面的對象,Add的時候將對象轉化一下,這樣就需要比較多的轉化;
--
另一種解決方案是將數據直接進行展示;
--
如果是另有一個對象進行顯示,就是在轉化的時候將懶加載的操作全部做完成;因為沒有將數據拿出來就不能轉化為這個對象;
在Hibernate操作的時候,就需要有懶加載,這裏是User和Post多對一 ,User和Department是多對多,就可能會引起異常;三張表的迫切左外連接,就可以出來了;
OpenSessionInView在ajax中是不起作用的;
但是如果使用迫切左外鏈接,也要分情況,這時候如果表中字段太多,界面字段過少,就會浪費資源;
企業的做法是:VO和BO企業中很少用了,轉化太麻煩了;一般還是使用左外連接,或者將User拿出來,在頁面中在將其拿出來,OpenSessionInView;
---
查詢:
1、現象
在頁面上存在多個字段,來自於多個表
2、解決方案

1、建立一個javabean,該javabean和頁面上的字段關聯
             public class UserView{
                  private String username;
                  private String dname;
                  private Set<Post> posts;
             }


優點:
類的組織一目瞭然
不存在懶加載的問題
缺點:
該結構和dao層的結構不一致,在後台需要進行轉化
2、從頁面到action-->service--->dao,整個的數據的傳遞採用hibernate的類型結構
優點:
傳遞比較簡單,不用進行轉化
缺點:
有可能出現懶加載的異常
----
直接使用from User,可能出現懶加載異常;
迫切左外鏈接;from User u left join fetch u.department d left join fetch u.posts p
這裏去重的方法:List<User> userList = this.hibernateTemplate.find("from User u left join fetch u.department d left join fetch u.posts p ");
return new HashSet<User>(userList);
這樣就可以去重;
hibernateTemplate需要改為public;

刪除就不需要考慮太多,但是部門那邊的就需要注意刪除的時候;

增加的時候:
增加:
如果頁面上的數據來自於很多張表,後台要獲取所有的數據,可以採用模型驅動結合屬性驅動的方式解決

public class UserAction extends BaseAction<User>{

	private Long did;

	private Long[] pids;結合模型驅動和屬性驅動去做;
public String add() throws Exception{
		/**
		 * 1、保存用户
		 * 2、建立用户和崗位之間的關係
		 * 3、建立用户和部門之間的關係
		 */
		User user = new User();
		/**
		 * 一般屬性
		 */
		BeanUtils.copyProperties(this.getModel(), user);
		//建立用户和部門之間的關係
		Department department = this.departmentService.getDepartmentByID(this.did);
		//Department department = new Department();
		department.setDid(this.did);
		user.setDepartment(department);
		//建立用户和崗位之間的關係
		Set<Post> posts = this.postService.getPostsByIds(this.pids);
		user.setPosts(posts);
		this.userService.saveUser(user);
		return action2action;
	}@Override
	public Collection<User> getAllUser() {
		// TODO Auto-generated method stub
		List<User> userList =  this.hibernateTemplate.find("from User u left join fetch u.department d left join fetch u.posts p");
		return new HashSet<User>(userList);
	}@Override
	public Set<Post> getPostsByIds(Long[] ids) {
		//ids = [1,2,3]   in (1,2,3)
		StringBuffer buffer = new StringBuffer();
		buffer.append("from Post where pid in(");
		for(int i=0;i<ids.length;i++){
			if(i==ids.length-1){
				buffer.append(ids[i]+")");
			}else{
				buffer.append(ids[i]+",");
			}
		}
		return new HashSet<Post>(this.hibernateTemplate.find(buffer.toString()));
	}修改的操作:
public String updateUI() throws Exception{
		/**
		 * 回顯
		 * 	1、一般屬性
		 * 	2、部門
		 * 	3、崗位
		 * 部門的數據全部列出來
		 * 崗位的數據全部列出來
		 */
		User user = this.userService.getUserById(this.getModel().getUid());
		//用於一般屬性的回顯
		ActionContext.getContext().getValueStack().push(user);
		//要回顯崗位信息和部門信息,必須把did和pids放入到對象棧中
		//針對department的加載是懶加載,但是OpenSessionInView模式,所以這個時候session並沒有關閉
		this.did = user.getDepartment().getDid();
		Set<Post> posts = user.getPosts();
		this.pids = new Long[posts.size()];
		int index = 0;
		for(Post post:posts){
			pids[index] = post.getPid();
			index++;
		}

		Collection<Post> postList = this.postService.getAllPost();
		Collection<Department> dList = this.departmentService.getAllDepartment();
		ActionContext.getContext().put("pList", postList);
		ActionContext.getContext().put("dList", dList);
		return updateUI;
	}

	public String update() throws Exception{
		/**
		 * 修改用户的一般信息
		 * 重新建立用户和部門之間的關係
		 * 重新建立用户和崗位之間的關係
		 */
		User user = this.userService.getUserById(this.getModel().getUid());
		//設置用户的一般信息
		BeanUtils.copyProperties(this.getModel(), user);
		//建立用户和部門之間的關係
		Department department = this.departmentService.getDepartmentByID(this.did);
		user.setDepartment(department);
		//建立用户和崗位之間的關係
		Set<Post> posts = this.postService.getPostsByIds(this.pids);
		user.setPosts(posts);

		this.userService.updateUser(user);
		return action2action;
	}