标签:div 上下 自动 stat 数据库访问 cep jpa 调用 模式
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
学习视频:尚硅谷框架jpa学习(有兴趣的同学留言邮箱)
使用软件:eclipse
Java版本:jdk8
三、JPA_API
1.Persistence
2.EntityManagerFactory
3.entityManager
4.EntityTransaction
实体的状态:
1.新建状态:新创建的状态,尚未拥有持久性主键
2.持久化状态:已经拥有持久性主键并和持久化建立了上下文环境
3.游离状态:拥有持久化主键,但是没有与持久化建立上下文环境
4.删除状态:拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中删除
//类似于hibernate中session的get方法 @Test public void testFind() { Customer customer = entityManager.find(Customer.class, 1); System.out.println("---------------------------"); System.out.println(customer.toString()); }
//类似于hibernate中session的load方法 @Test public void testGetReference() { Customer customer = entityManager.getReference(Customer.class, 1); //这是一个代理对象,可能会出现懒加载异常,即在使用当前customer之前就把entityManager关闭,就无法进行数据库访问 System.out.println(customer.getClass().getName()); System.out.println("---------------------------"); System.out.println(customer.toString()); }
//类似于hibernate中的save方法,使对象由临时状态变为持久化状态 //和hibernate的save方法的不同之处:若对象有id,则不能执行insert操作,而会抛出异常 @Test public void testPersistence() { Customer customer = new Customer(); customer.setAge(12); customer.setEmail("937724308@qq.com"); customer.setLastName("xiong"); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); entityManager.persist(customer); //可以打印Id System.out.println(customer.getId()); }
//类似于hibernate的delete方法,把对象对应的记录从数据库中移除 //但注意:该方法只能移除持久化对象。二hibernate的delete方法实际上还可以移除游离对象 @Test public void testRemove() { Customer customer = entityManager.find(Customer.class, 2); entityManager.remove(customer); }
//若传入的是一个游离对象, 即传入的对象有 OID. //1. 若在 EntityManager 缓存中有对应的对象 //2. JPA 会把游离对象的属性复制到查询到EntityManager 缓存中的对象中. //3. EntityManager 缓存中的对象执行 UPDATE. @Test public void testMerge4(){ 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(4); Customer customer2 = entityManager.find(Customer.class, 4); entityManager.merge(customer); System.out.println(customer == customer2); //false } //若传入的是一个游离对象, 即传入的对象有 OID. //1. 若在 EntityManager 缓存中没有该对象 //2. 若在数据库中也有对应的记录 //3. JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中. //4. 对查询到的对象执行 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 } //若传入的是一个游离对象, 即传入的对象有 OID. //1. 若在 EntityManager 缓存中没有该对象 //2. 若在数据库中也没有对应的记录 //3. JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中 //4. 对新创建的对象执行 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()); } /** * 总的来说: 类似于 hibernate Session 的 saveOrUpdate 方法. */ //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()); }
标签:div 上下 自动 stat 数据库访问 cep jpa 调用 模式
原文地址:https://www.cnblogs.com/xzmxddx/p/9280089.html