三、几个常用的接口和类
1. EntityManagerFactory->EntityManager->begin事务(事务增、删、改时必须使用)
相当于SessionFacotry->session->begin事务
@Test public void save() {//保存 EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin();//读取不要事务,添加、更新、删除需要事务 em.persist(new Buyer("susen","1234","ss@ss.com")); em.getTransaction().commit(); em.close(); factory.close(); } |
n em.persist();//持久化,保存
n em.remove();//删除
n em.find(Buyer.class, "susen");//第一个参数是类,第二个参加通过主键的内容查找
n em.clear();//使实体对象变成游离状态,修改内容不能更新到数据库
n em.merge();//更新,将游离状态更新(同步)到数据库
n em.refresh();//如果数据库中的内容被改变后,我们在程序中可以用这个,得到最新的数据不能再次调用find方法,因为find方法会从em的一级缓存中取出未更新前的数据。
2. 实体对象拥有以下4个状态,这些状态通过调用EntityManager接口方法发生迁移:
n 新建态:新创建的实体对象,尚未拥有持久化主键,没有和一个持久化上下文关联起来;
n 受控态:已经拥有持久化主键并和持久化上下文建立了联系;
n 游离态:拥有持久化主键,但尚未和持久化上下文建立联系;
n 删除态:拥有持久化主键,已经和持久化上下文建立联系,但已经被安排从数据库中删除。
3. EntityManager 的API
下面是EntityManager的一些主要的接口方法:
n void persist(Object entity)
通过调用EntityManager的persist()方法,新实体实例将转换为受控状态。这意谓着当persist ()方法所在的事务提交时,实体的数据将保存到数据库中。如果实体已经被持久化,那么调用persist()操作不会发生任何事情。如果对一个已经删除的 实体调用persist()操作,删除态的实体又转变为受控态。如果对游离状的实体执行persist()操作,将抛出 IllegalArgumentException。
在一个实体上调用persist()操作,将广播到和实体关联的实体上,执行相应的级联持久化操作;
n void remove(Object entity)
通过调用remove()方法删除一个受控的实体。如果实体声明为级联删除(cascade=REMOVE 或者cascade=ALL ),被关联的实体也会被删除。在一个新建状态的实体上调用remove()操作,将被忽略。如果在游离实体上调用remove()操作,将抛出 IllegalArgumentException,相关的事务将回滚。如果在已经删除的实体上执行remove()操作,也会被忽略;
n void flush()
将受控态的实体数据同步到数据库中;
n T merge(T entity)
将一个游离态的实体持久化到数据库中,并转换为受控态的实体;
n T find(Class entityClass, Object primaryKey)
以主键查询实体对象,entityClass是实体的类,primaryKey是主键值,如以下的代码查询Topic实体:
Topic t = em.find(Topic.class,1);