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();
}