JPA EntiityManager.merge方法


merge 方法

  • 插入 或 更新
  • merge 方法不會改變傳入的實體的狀態
  • merge 方法會返回一個 Managed 狀態的實體,可以進行 remove,setter 等操作

merge 方法測試

merge 方法插入無 id 實體

        前提:配置實體的主鍵生成策略為自動生成,否則會拋出異常

@Test
public void test1() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
    EntityManager em = factory.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    Student s = new Student();
    s.setSname("趙雲");
    s.setSage(19);

    em.merge(s);
    /*
    Hibernate:
        insert
        into
            Student
            (sage, sname)
        values
            (?, ?)

     */

    tx.commit();
    em.close();
    factory.close();
}

merge 方法插入有 id 實體

        前提:數據庫對應的表中沒有此 id 的記錄(立即發出 SQL 語句查詢底層數據庫),否則就是 更新。

        若配置主鍵自動生成,則新增記錄的 id 為 自動生成的 id,否則新增記錄的 id 為 實體中設置好的 id。下面是第一種情況的測試程序:

@Test
public void test2() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
    EntityManager em = factory.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    Student s = new Student();
    s.setSid(400L); // 數據庫中沒有 id 為 4 的記錄
    s.setSname("曹操");
    s.setSage(28);

    em.merge(s);
    /*

    Hibernate:
        select
            student0_.sid as sid1_0_0_,
            student0_.sage as sage2_0_0_,
            student0_.sname as sname3_0_0_
        from
            Student student0_
        where
            student0_.sid=?
    Hibernate:
        insert
        into
            Student
            (sage, sname)
        values
            (?, ?)

     最終存入(16,28,曹操),id 是自動生成的 16,而不是 400

     */

    tx.commit();
    em.close();
    factory.close();
}

merge 方法更新有 id 實體

        前提:數據庫對應的表中有對應 id 的記錄(立即發出 SQL 語句查詢底層數據庫),否則就是 插入

@Test
public void test2() {
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
    EntityManager em = factory.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    Student s = new Student();
    s.setSid(4L); // 數據庫中有 id 為 4 的記錄
    s.setSname("趙雲");
    s.setSage(18);

    em.merge(s);
    /*

    Hibernate:
        select
            student0_.sid as sid1_0_0_,
            student0_.sage as sage2_0_0_,
            student0_.sname as sname3_0_0_
        from
            Student student0_
        where
            student0_.sid=?

     */

    tx.commit();
    /*

    Hibernate:
        update
            Student
        set
            sage=?,
            sname=?
        where
            sid=?
    存入 (趙雲,18)

     */
    em.close();
    factory.close();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM