JPA学习02
滴水穿石
使用单元测试
private EntityManagerFactory enFactory = null; private EntityManager entityManager = null; private EntityTransaction transaction = null; @Before public void init(){ //1.创建EntityManagerFactory String persistenceUnitName = "Jpa01"; enFactory = Persistence.createEntityManagerFactory(persistenceUnitName); //2.创建EntityManager entityManager = enFactory.createEntityManager(); //3.开启事务 transaction = entityManager.getTransaction(); transaction.begin(); } @After public void destory(){ //5.提交事务 transaction.commit(); //6.关闭EntityManager entityManager.close(); //7.关闭EntityManagerFactory enFactory.close(); }
Merge()方法测试01————临时对象
@Test public void testMerge1() { Customer customer = new Customer(); customer.setAge(11); customer.setEmail("111@cfb.com"); customer.setName("aaa"); Customer customer2 = entityManager.merge(customer); System.out.println("customer # id = " + customer.getId()); System.out.println("customer2 # id = " + customer2.getId()); }
传入的对象没有ID,即为临时对象
若传入的是一个临时对象,
会创建一个新的对象,把临时对象的属性复制到新对象中,然后对新对象执行持久化操作。
所以新对象中有Id,但以前的临时对象中没有ID
Merge()方法测试02————游离对象
EntityManager缓存中不存在,数据库中也不存在的游离对象
@Test public void testMerge2() { Customer customer = new Customer(); customer.setAge(11); customer.setEmail("111@cfb.com"); customer.setName("aaa"); customer.setId(100); Customer customer2 = entityManager.merge(customer); System.out.println("customer # id = " + customer.getId()); System.out.println("customer2 # id = " + customer2.getId()); }
游离对象,即对象有ID
1.若在EntityManager缓存中没有该对象
2.若在数据库中也没有对应的记录
3.JPA会创建一个新的对象,把当前的游离对象属性复制到新创建的对象中
4.对新创建的对象执行Insert()操作
EntityManager缓存中不存在,数据库中存在的游离对象
@Test public void testMerge3() { Customer customer = new Customer(); customer.setAge(11); customer.setEmail("xxx@cfb.com"); customer.setName("aaa"); customer.setId(4); Customer customer2 = entityManager.merge(customer); System.out.println("customer # id = " + customer.getId()); System.out.println("customer2 # id = " + customer2.getId()); }
1.若传入的是一个游离对象
2.在EntityManager缓存中没有该对象
3.在数据库中有该对象
4.JPA会查询对应的记录,然后返回该记录对应的对象,再然后把游离对象的属性复制到查询到的对象中
5.对查询到的对象执行update操作
EntityManager缓存中存在,数据库中也存在的游离对象
@Test public void testMerge4() { Customer customer = new Customer(); customer.setAge(11); customer.setEmail("xxx@cfb.com"); customer.setName("aaa"); customer.setId(4); Customer customer2 = entityManager.find(Customer.class, 4); Customer customer3 = entityManager.merge(customer); System.out.println("customer # id = " + customer.getId()); System.out.println("customer2 # id = " + customer2.getId()); System.out.println("customer3 # id = " + customer3.getId()); }
1.EntityManager缓存中存在对象
2.JPA会把游离对象的属性复制到查询到EntityManager缓存中的对象中
3.EntityManager缓存中的对象执行Update()操作
总结:
1.临时对象
2.游离对象
2.1 EntityManager缓存中没有,数据库没有
2.2 EntityManager缓存中没有,数据库中有
2.3 EntityManager缓存中有,数据库中有
Hibernate的操作不允许session同时操作两个ID相同的游离对象,JPA的merge()是可以的
—————————————————————————————————————————————————————————————————————————
无论如何,心平气和