hibernate使用註解無法進行更新操作的解決方法
阿新 • • 發佈:2019-02-13
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>();
此時就無法更新。改一下mappedBy位置,由學生端維護外來鍵即可。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(); }
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();