1. 程式人生 > >hibernate使用註解無法進行更新操作的解決方法

hibernate使用註解無法進行更新操作的解決方法

1.一般來說,在多對多的雙向關聯中,往往是修改頻繁的一方放棄外來鍵維護。但在實際運用時要靈活選擇,如學生選課中,按照前邊那個約定,應該是課程一方維護外來鍵,但若程式中是按照學號查詢一個學生選了哪些課,而不是查詢一門課由哪些學生選擇,則應該由學生端維護外來鍵。否則會出現無法更新課程的問題。如原來的寫法

Course和Student實體類

@Entity
@Table(name="t_course")
public class Course {
	
	@Id
	@GeneratedValue
	private int cid;//課程id
	private String cname;
	
	@ManyToMany
	@JoinTable(name="stu_course",  //關於中間表的處理,表名
	joinColumns={@JoinColumn(name="cid")}, //中間表的欄位名
	inverseJoinColumns={@JoinColumn(name="sid")}
		)
	private Set<Student> setstu = new HashSet<Student>();

/*****************************************************************/

@Entity
@Table(name="t_stu")
public class Student {
	@Id
	@GeneratedValue
	private int sid;//學生id
	private String sname;
	private String pwd;
	
	@ManyToMany(mappedBy="setcourse")
	
	private Set<Course> setcourse = new HashSet<Course>();
更新的程式碼
public void selectCourse(int sid,Integer[] cids){//注意這兒cids為陣列
		Session session = HiberUtil.getsession();
		session.beginTransaction();
		Student stu = (Student) session.get(Student.class, sid);//從session裡獲取的為持久態物件
		Set<Course> setcourse1 = new HashSet<Course>();
		for (int i = 0; i < cids.length; i++) {
			Course c = (Course) session.get(Course.class, cids[i]);
			setcourse1.add(c);
		}
		
		stu.setSetcourse(setcourse1);
		//session.update(stu);//不寫這句也可,因為stu為persistent狀態
		//setcourse1是瞬時態的,因為它每次都是new出新的一個。相當於每次都是把選的課清空,再新增進課程表中,
		//所以可把update刪除
		session.getTransaction().commit();
}
此時就無法更新。改一下mappedBy位置,由學生端維護外來鍵即可。

2.還有一種情況就是hibernate更新機制與以往的servlet不同,servlet是先根據id獲取物件然後再修改。在hibernate中,更新物件資料時,會先從一級快取中將該物件取出來,然後把獲取的各項資料和快取中的資料項比較,如果沒有改變就不進行update操作。在hibernate中若按照以前的寫法,靠id獲取物件和快取中的物件是一樣的,所以不修改。如

session.beginTransaction();
session.update(session.get(News.class, id));
//session.update(news);
session.getTransaction().commit();
//此時就無法更新


//這是可以更新的寫法
ss.beginTransaction();
news.setNewsTitle(news.getNewsTitle());//需要set進去
news.setContent(news.getContent());
//ss.update(ss.get(News.class, id));
ss.update(news);
ss.getTransaction().commit();
在平時要注意這些小細節。