博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA基础(三)(转)
阅读量:6847 次
发布时间:2019-06-26

本文共 2244 字,大约阅读时间需要 7 分钟。

4.操作EntityManageri.持久化实体:就是将对象插入到数据库中,你所持久化的还是未曾保持到数据库中的实体,要持久化实体,首先要为实体分配内存,然后设置成员属性,并设置好与其他对象可能存在的任何关联关系,最后你就可以调用EntityManager.persist()方法来保持该实体了.*/Customer cust = new Customer();cust.setName("Bill");entityManager.persist(cust);/**当调用persist()方法后,EntityManager会将Customer添加到等待数据库插入的队列中,对象实例即处于托管状态,实际的操作要看:如果实在事务范围内调用,插入操作可能马上就执行,也可能在事务提交时执行,这依赖于flush模式,任何时候你都可以通过flush操作在一个事务内强制插入操作.ii.查找实体:提供了2种方法:find(),getReference().*/public interface EntityManager{   T find(Class entityClass, Object primayKey);   T getReference(Class entityClass, Object primarykey);}/**2个方法都接受实体的class和代表实体主键的对象作为参数,区别是如果找不到指定实体时,find方法会返回null,getReference方法会抛出javax.persistent.EntityNotFoundException,并且该方法并不保证实例的内部状态不会被初始化.若是transaction-scope persistence contenxt,则返回游离对象(记住是在事务范围之外调用这2个方法).*/Customer cust = entityManager.find(Customer.class,1);/**我们还可以使用EJB QL来查询,使用CreateNativeQuery()来创建Query对象来进行查询.*/Query query = entityManager.CreateQuery("FROM Customer c WHERE id=2");Customer cust = (Customer)query.getSingleResult();/**由于你一旦调用了find(),getResource()方法,或使用查询对象执行了一次查询,所得的entity bean 在persisten测 context关闭前仍将处于托管状态,在此期间,你可以像其他对象那样随便更改entity bean实例的状态,任何更改都将自动过手动地同步到数据库中.iii.合并实体:你可以使用EntityManager的meger()方法,将游离实体的状态合并到数据库中,假设有一个Swing客户端,它调用了TravleAgent Session bean的远程方法,用以查找数据库中的cabinet实体.看代码:*/@persistenceContext EntityManager entityManager;@TransactionAttribute(REQUIRED)public Cabin findCabin(int pid){  return entityManager.find(Cabin.class, pid);}/**在findCabin()结束后,persistence context被销毁,entity bean 处于非托管状态,当Cabin实例被序列化,并被送到远程的Swing客户端,此时,该Cabin实例是一个普通的Java对象.Swing客户端更改了这一Cabin实例的状态,然后将其重新送回服务器.看代码:*/Cabin cabin = trvalAgent.findCabin(1);cabin.setBedCount(4);trvalAgent.updateCabin(cabin);//--------------------------------------------//@persistenceContext EntityManager entityManager;@TransactionAttribute(REQUIRED)public void updateCabin(Cabin cabin){  Cabin copy = entityManager.merge(cabin);}/**需要注意2中情况:1.若EntityManager未曾管理与传入的cabin参数有着相同的Cabin实例,则merge()方法会创建该参数的一份完整拷贝做为方法的返回值,该拷贝受entityManager对象的管理,并且任何针对该份操作做的更改,而传入的cabin参数仍将保持游离状态,不受托管.2.若拥有与传入的Cabin参数有着相同的Cabin实例,则托管到托管的对象实例中,其余的同上操作.*///本文出自 “stoneli88” 博客,请务必保留此出处//http://stoneli88.blog.51cto.com/333387/221116

转载于:https://www.cnblogs.com/ShortHinny/archive/2012/04/19/2457228.html

你可能感兴趣的文章
DNS搭建
查看>>
JS如何实现对name是数组的复选框的全选和反选以及取消选择
查看>>
Java NIO 之 Buffer
查看>>
mysql基本使用
查看>>
BASH相关
查看>>
linux 文件类型 时间戳 ls bash特性四 文件查看命令 cp move echo
查看>>
NetScaler的部署实验之八更新StoreFront的配置更改
查看>>
window Linux 系统安装盘制作
查看>>
**15.app后端怎么设计用户登录方案(API权限安全)
查看>>
Linux的PXE kickstart网络自动装机
查看>>
linux系统学习第九天-<<工程师技术>>
查看>>
linux计划任务的管理
查看>>
CentOS7.1安装VNC,让Win7远程桌面Linux
查看>>
python常用模块email----创建简单的文本邮件并发送
查看>>
OSPF协议学习总结
查看>>
java读取文件
查看>>
hive出现其他用户没有表操作权限的解决办法
查看>>
java设计模式之模板方法模式
查看>>
LINUX系统服务与管理(Services)---------第三天
查看>>
如何在word中快速切换单词中字母大小写
查看>>