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