在 JPA 规范中, EntityManager 是完成持久化操作的核心对象。实体作为普通 Java 对象,只有在调用 EntityManager 将其持久化后才会变成持久化对象。EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句查询实体。
- 实体的状态
新建状态: 新创建的对象,尚未拥有持久性主键。
持久化状态:已经拥有持久性主键并和持久化建立了上下文环境
游离状态:拥有持久化主键,但是没有与持久化建立上下文环境
删除状态: 拥有持久化主键,已经和持久化建立上下文环境,但是准备从数据库中删除。
- void persist(t entity)
新实体状态(new)转化为持久化状态(managed): insert into pdsa.JpaEntityTest (content, id) values (‘jpa persist test’, ‘cd754bc8-8831-4ec9-8119-dc90ce743d70’);
持久化(managed)的实体,则调用persist方法不会发生任何事情;
删除状态(removed)的实体调用persist方法,则抛出异常EntityNotFoundException: deleted entity passed to persist。
游离态(detached)的实体执行persist操作,则抛出异常java.sql.BatchUpdateException: ORA-00001: 违反唯一约束条件。发起两条语句:insert into pdsa.JpaEntityTest (content, id) values (‘jpa persist test’, ‘cd754bc8-8831-4ec9-8119-dc90ce743d70’);insert into pdsa.JpaEntityTest (content, id) values (‘jpa persist test’, ‘cd754bc8-8831-4ec9-8119-dc90ce743d70’);
- void remove(t entity)
新实体状态(new)的实体上调用remove操作,将被忽略。发起语句:select jpaentityt_.id, jpaentityt_.content as content2_ from pdsa.JpaEntityTest jpaentityt_ where jpaentityt_.id=‘123456789’;
游离态的实体上调用remove操作,将抛出IllegalArgumentException异常,IllegalArgumentException: Removing a detached instance。
删除态的实体上调用remove操作,将被忽略。
删除持久化managed实体,发起语句:delete from pdsa.JpaEntityTest where id=‘cd754bc8-8831-4ec9-8119-dc90ce743d70’;
- void flush()
持久化态的实体数据同步到数据库中。发起语句:update pdsa.JpaEntityTest set content=‘jpa flush test’ where id=‘5f7a3f03-fe54-4a3c-b8bb-9c598ad983cb’;
- T merge(T entity)
游离态的实体,该方法会将修改提交到数据库,并产生一个Managed态的实体。发起语句:select jpaentityt0_.id as id2_0_, jpaentityt0_.content as content2_0_ from pdsa.JpaEntityTest jpaentityt0_ where jpaentityt0_.id=‘56b43bda-0c4f-49e1-8426-69f1fab4cf1f’;
如果游离态的实体进行了修改还会发起语句:update pdsa.JpaEntityTest set content=‘detached to managed 2’ where id=‘56b43bda-0c4f-49e1-8426-69f1fab4cf1f’;
new态的实体,该方法会产生一个managed态的实体。发起语句:select jpaentityt0_.id as id2_0_, jpaentityt0_.content as content2_0_ from pdsa.JpaEntityTest jpaentityt0_ where jpaentityt0_.id=‘56b43bda-0c4f-49e1-8426-69f1fab4cf1f’;
insert into pdsa.JpaEntityTest (content, id) values (‘jpa merge test’, ‘56b43bda-0c4f-49e1-8426-69f1fab4cf1f’);
managed态的实体,修改了该实体会发起语句:update pdsa.JpaEntityTest set content=‘managed to managed’ where id=‘56b43bda-0c4f-49e1-8426-69f1fab4cf1f’;
不修改该实体不会发起update语句。
emove态的实体,该方法会抛出异常:IllegalArgumentException: org.hibernate.ObjectDeletedException: deleted instance passed to merge。
- oid refresh(T entity)
new态的实体,该方法抛出异常:IllegalArgumentException: Entity not managed。
managed态的实体,它的属性将与数据库中的数据同步。发起语句:select jpaentityt0_.id as id2_0_, jpaentityt0_.content as content2_0_ from pdsa.JpaEntityTest jpaentityt0_ where jpaentityt0_.id=‘4c89ee55-9cc7-4578-bfed-d30750f3e7c6’;
remove态的实体,该方法抛出异常:IllegalArgumentException: Entity not managed。
detached态的实体,该方法抛出异常:IllegalArgumentException: Entity not managed。
- T find(Class entityClass,Object primaryKey)
以主键查询实体对象,entityClass是实体的类,primaryKey是主键值。发起语句:select jpaentityt0_.id as id2_0_, jpaentityt0_.content as content2_0_ from pdsa.JpaEntityTest jpaentityt0_ where jpaentityt0_.id=‘4c89ee55-9cc7-4578-bfed-d30750f3e7c6’;
- Query createQuery(String qlString)
根据JPA的查询语句创建一个查询对象Query。
Query qr = em.createQuery("select id from JpaEntityTest");
List list = qr.getResultList();
System.out.println(list.toString());
select jpaentityt0_.id as col_0_0_ from pdsa.JpaEntityTest jpaentityt0_;
[4c89ee55-9cc7-4578-bfed-d30750f3e7c6, 56b43bda-0c4f-49e1-8426-69f1fab4cf1f, 5f7a3f03-fe54-4a3c-b8bb-9c598ad983cb]
- Query createNativeQuery(String sqlString)
使用本地数据库的sql语句创建一个query对象。
Query qr = em.createNativeQuery("select * from JpaEntityTest");