JPA 常用操作 与 Hibernate 的区别

来源:互联网 发布:最近破获网络涉枪案件 编辑:程序博客网 时间:2024/06/06 01:52

前提:

//  ###########  原 Hibernate 写法   ###############//Configuration conf = new Configuration();//SessionFactory sf = conf.configure().buildSessionFactory();//Session s = sf.openSession();//Transaction tx = s.beginTransaction();//s.save(null);//tx.commit();//s.close();// ############# JPA 写法    #############//创建实体管理器工厂   === 相当于 sessionFactoryEntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");//创建实体管理器 === 相当于sessionEntityManager em = emf.createEntityManager();//通过实体管理器获得事务对象EntityTransaction tx = em.getTransaction();tx.begin();Customer c = new Customer();c.setName("toma");em.persist(c);tx.commit();em.close();


1.查找

em.find(Customer.class,1)   与  s.get(Customer.class,1) 一致,

先查缓存,再查数据库,数据库无则返回null.......不会主动产生代理,亦即不能实现延迟加载。

但若,先前缓存有代理对象,该方法也会优先返回代理对象。


em.getReference(Customer.class, 1)  与  s.load(Customer.class,1) 一致,

先查缓存,再查数据库,数据库无则抛异常.....该方法会在缓存产生代理对象。


查询所有

Query q = em.createQuery("select c from Customer c");

q.getResultList();


2.更新

①更新持久对象:查找出来即为持久态,直接修改即可。

②更新游离对象:

c = em.merge(c),该方法类似 s.saveOrUpdate 

区别:

1. merge 缓存的是实体对象的副本,即将副本变为持久化对象,该方法返回副本。

   saveOrUpdate 直接缓存 实体对象,无返回。

2.实体对象无id:两个方法都是插入。

3.实体对象有id 且 该id在数据库中存在:两个方法都更新。

4.实体对象有id 但  该id在数据库中不存在:merge 插入,但id被重置为表中序列下一值。saveOrUpdate 抛异常。


3.插入

em.persist,该方法与 s.save 类似

区别:

persist : 实体对象带有id,报错。

save :无视实体对象的id。


4.删除

em.remove(em.merge(c)), remove 只能删除持久化对象。

而 s.delete(c),则可删除游离对象。


Query q = em.createQuery("delete from Customer c where id >2");

q.executeUpdate();


0 0