EntityManger方法发起的SQL语句——控制实体的生命周期(状态转换)

在 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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值