溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

hibernate使用save持久化了實(shí)體后再改變實(shí)體的值

發(fā)布時(shí)間:2020-06-28 19:06:23 來源:網(wǎng)絡(luò) 閱讀:485 作者:matengbing 欄目:數(shù)據(jù)庫
public static void addStudent(){
        sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
        Session session=sessionFactory.getCurrentSession();
        session.beginTransaction();
        Student student=new Student( "李四", 34);
        session.save(student);
        student.setName("王五");
        Iterator<Student> iterator=(Iterator<Student>) session.createQuery("from Student").iterate();
            while(iterator.hasNext()){
                System.out.println(iterator.next().toString());
            }
        
        session.getTransaction().commit();
    }

注意

session.save(student);
student.setName("王五");

session持久化了實(shí)體后,只是寫入了session緩存中,commit前并沒有寫入數(shù)據(jù)庫中,此時(shí)再改變

實(shí)體,保存到數(shù)據(jù)庫的實(shí)體為修改過的實(shí)體。

hibernate使用save持久化了實(shí)體后再改變實(shí)體的值

public static void updateStudent(){
        sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
        Session session=sessionFactory.getCurrentSession();
        session.beginTransaction();
        Student student=(Student) session.get(Student.class, 2);
        student.setName("update");
        Iterator<Student> iterator=(Iterator<Student>) session.createQuery("from Student").iterate();
            while(iterator.hasNext()){
                System.out.println(iterator.next().toString());
            }
        
        session.getTransaction().commit();
    }

從數(shù)據(jù)庫中查找id為2的記錄后,此時(shí)session緩存中有了實(shí)體,直接修改實(shí)體的值,不用update,session提交后,數(shù)據(jù)庫的記錄依然被修改了

hibernate使用save持久化了實(shí)體后再改變實(shí)體的值

對(duì)于先查詢?cè)傩薷模?/p>

不寫update,merge和

session.update(student);

session.merge(student);

都是一樣的,commit后數(shù)據(jù)都會(huì)寫入數(shù)據(jù)庫

Student student=new Student(10,"update", 100);
        session.update(student);

直接new一個(gè)實(shí)體(其id=10的記錄在數(shù)據(jù)庫中不存在),直接update報(bào)錯(cuò)

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

此Student對(duì)象的id設(shè)置了自增,其id=10的記錄在數(shù)據(jù)庫中不存在,

Student student=new Student(10,"update", 100);
        session.merge(student);

結(jié)果數(shù)據(jù)庫保存了記錄,但是id不為10,而是按照自增的結(jié)果,為6(插入前最大為5)

hibernate使用save持久化了實(shí)體后再改變實(shí)體的值

Student student=new Student(11,"update", 100);
        session.saveOrUpdate(student);

而想象中可以完成此操作的saveOrUpdate()卻也報(bào)錯(cuò)

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
Hibernate: 
    update
        Student 
    set
        age=?,
        name=? 
    where
        id=?

發(fā)出的sql竟然是update,怎么不是save,應(yīng)該是自動(dòng)選擇才對(duì)?

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI