前提:
// ########### 原 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 写法 #############
//创建实体管理器工厂 === 相当于 sessionFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");
//创建实体管理器 === 相当于session
EntityManager 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();