import
javax.persistence.EntityManager;
import
javax.persistence.EntityManagerFactory;
import
javax.persistence.EntityTransaction;
import
javax.persistence.Persistence;
import
java.util.Date;
public
class
MergeTest {
private
EntityManagerFactory entityManagerFactory;
private
EntityManager entityManager;
private
EntityTransaction transaction;
@Before
public
void
init() {
entityManagerFactory
= Persistence.createEntityManagerFactory("jpaname"
);
entityManager
=
entityManagerFactory.createEntityManager();
transaction
=
entityManager.getTransaction();
transaction.begin();
@After
public
void
destroy() {
transaction.commit();
entityManager.close();
entityManagerFactory.close();
//
1. 若传入的是一个临时对象
//
会创建一个新的对象, 把临时对象的属性复制到新的对象中, 然后对新的对象执行持久化操作
//
所以新的对象中有 id, 但以前的临时对象中没有 id
@Test
public
void
testMerge1() {
Customer customer
=
new
Customer();
customer.setAge(
18
);
customer.setBirth(
new
Date());
customer.setCreatedTime(
new
Date());
customer.setEmail(
"cc@163.com"
);
customer.setLastName(
"CC"
);
Customer customer2
=
entityManager.merge(customer);
System.out.println(
"customer#id:" +
customer.getId());
System.out.println(
"customer2#id:" +
customer2.getId());
2.若传入的是一个游离对象, 即传入的对象有 OID
// 2.若传入的是一个游离对象, 即传入的对象有 OID
// 若在 EntityManager 缓存中没有该对象
// 若在数据库中也没有对应的记录
// JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中
// 对新创建的对象执行 insert 操作
@Test
public void testMerge2() {
Customer customer = new Customer();
customer.setAge(18);
customer.setBirth(new Date());
customer.setCreatedTime(new Date());
customer.setEmail("dd@163.com");
customer.setLastName("DD");
customer.setId(100);
Customer customer2 = entityManager.merge(customer);
System.out.println("customer#id:" + customer.getId());
System.out.println("customer2#id:" + customer2.getId());
3.若传入的是一个游离对象, 即传入的对象有 OID,在数据库中有对应的记录
// 3.若传入的是一个游离对象, 即传入的对象有 OID,在数据库中有对应的记录
// 在 EntityManager 缓存中没有该对象
// JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中
// 对查询到的对象执行 update 操作
@Test
public void testMerge3(){
Customer customer = new Customer();
customer.setAge(18);
customer.setBirth(new Date());
customer.setCreatedTime(new Date());
customer.setEmail("ee@163.com");
customer.setLastName("EE");
customer.setId(4);
Customer customer2 = entityManager.merge(customer);
System.out.println(customer == customer2); //false
4.若传入的是一个游离对象, 即传入的对象有 OID,在 EntityManager 缓存中有对应的对象
// 4.若传入的是一个游离对象, 即传入的对象有 OID,在 EntityManager 缓存中有对应的对象
// JPA 会把游离对象的属性复制到查询到 EntityManager 缓存中的对象中
// EntityManager 缓存中的对象执行 UPDATE
@Test
public void testMerge4(){
Customer customer = new Customer();
customer.setAge(18);
customer.setBirth(new Date());
customer.setCreatedTime(new Date());
customer.setEmail("dds@163.com");
customer.setLastName("DD");
customer.setId(4);
Customer customer2 = entityManager.find(Customer.class, 4);
entityManager.merge(customer);
System.out.println(customer == customer2); //false