框架学习之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
三、JPA_API
1.Persistence
- Persistence类是用于获取EntityManagerFactory实例。该类包含一个名为createEntityManagerFactory的静态方法。
- createEntityManagerFactory方法有如下两个重载方法
- 带有一个参数的方法以及JPA配置文件persistence。Xmi中的持久化单元名为参数
- 带有两个参数的方法:前一个参数含义相同,后一个参数Map类型,用于设置JPA的相关属性,这时将忽略其他地方设置的属性。Map对象的属性名必须是JPA实现库提供商的名字空间约定的属性名
2.EntityManagerFactory
- EntityManagerFactory接口主要用来创建EntityManager实例。该接口约定了如下四个方法
- createEntityManager():用于创建实体管理器对象实例
- createEntityManager(Map map):用于创建实体管理器对象实例的重载方法,Map参数用于提供EntityManager的属性。
- isOpen():检查EntityManagerFactory是否处于打开状态。实体管理器工厂创建后一直处于打开状态,除非用close()方法将其关闭
- close():关闭EntityManagerFactory。EntityManagerFactory关闭后将释放所有资源,isOpen()方法将返回false,其他方法将不能调用,否则将导致IllegalStateException异常
3.entityManager
实体的状态:
1.新建状态:新创建的状态,尚未拥有持久性主键
2.持久化状态:已经拥有持久性主键并和持久化建立了上下文环境
3.游离状态:拥有持久化主键,但是没有与持久化建立上下文环境
4.删除状态:拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中删除
- Find()
//类似于hibernate中session的get方法 @Test public void testFind() { Customer customer = entityManager.find(Customer.class, 1); System.out.println("---------------------------"); System.out.println(customer.toString()); }
- GetReference()
//类似于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()); }
- Persist()
//类似于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()); }
- Remove()
//类似于hibernate的delete方法,把对象对应的记录从数据库中移除 //但注意:该方法只能移除持久化对象。二hibernate的delete方法实际上还可以移除游离对象 @Test public void testRemove() { Customer customer = entityManager.find(Customer.class, 2); entityManager.remove(customer); }
- Merge()
//若传入的是一个游离对象, 即传入的对象有 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()); }
- SetFlushMode(FlushModeType flushMode):设置持久上下文换进的Flush模式。参数可以取两个枚举l Flush():同步持久上下文,即将持久上下文环境所有未保存实体的状态信息保存到数据库中。
- FlushModeType.AUTO为自动跟新数据库实体
- FlushModeType.COMMIT为直到提交事物时才更新数据库记录
- getFlushMode():获得持久上下文环境的Flush模式。返回FlushModeType的枚举值
- Refresh(Object entity):用数据库实体记录的值跟新实体对象的状态,即更新实例的属性值
- Clear():清除持久上下文环境,断开所有关联的实体。如果这是还有未提交的更新则会被撤销
- Contains(Object entity):判断一个实体是否属于当前持久上下文环境管理的实体
- lsOpen():判断当前实体管理器是否处于的打开状态
- getTransaction():返回资源层的事务对象。EntityTransaction实例可以用于开始和提交多个事务。
- Close():关闭实体管理器,之后若调用实体管理器实例的方法或其派生的查询对象的方法都将抛出IllegalstateException异常,除了getTransaction和idOpen方法
4.EntityTransaction
- Begin():用于启动一个事务,此后的多个数据库将作为整体被提交或者撤销,若这时事务已经被启动则会抛出异常IllegalstateException
- commit():用于提交当前事务。即将事务启动以后的所有数据库更新操作持久化至数据库中
- Rollback():撤销回滚操作。即撤销事务启动以后的的所有数据库更新操作,从而不对数据库产生影响。
- setRollbackOnly():使当前事务只能被撤销
- getRollbackOnly():查看当前事务是否设置了只能撤销标志
- lsActive():查看当前事务是否是活动的。