EJB笔记四 ——持久化实体管理器


配置文件persistence.xml
<persistence>
<persistence-unit name="example">
<jta-data-source>java:/DefaultMySqlDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>


可通过依赖注入EntityManager对象

如果persisitence.xml文件中配置了多个不同的持久化内容,在注入EntityManager对象时必须指定持久化名称,可通过@PersistenceContext(unitName=“持久化名称”)

1.persisitence.xml只有一个持久化内容
@PersistenceContext
protected EntityManager em;

2.persisitence.xml有二个或多个持久化内容
@PersistenceContext(unitName=“example”))
protected EntityManager em;



1、

1.1、如果知道实体的唯一标识符,可通过find或getReference方法获得实体
@PersistenceContext(unitName=“example”))
protected EntityManager em;
Person person=em.find(Person.class,1);
try{
Person p=em.getReference(Person.class,1);
}catch(EntityNotFoundException e){}

这2个方法的区别是当找不到对象时,find方法返回的是null 而getReference方法则会抛出异常

1.2、除了以上方法查找外,还可以通过createQuery或createNameQuery方法创建一个Query对象,然后通过query.getReslutList()获取对象

1.3 createNativeQuery();此方法传入的参数必须是SQL语句,区别于createQuery()方法

2、保存实体到数据库 persist()方法

3、更新实体

3.1、当实体正在被容器管理时,可通过find方法取得实体,然后通过set来设置更改值。若想实时更新到数据库中

可调用em.flush()方法

3.2、合并merge方法。此方法是在实体脱离EntityManager的管理时使用,同样可以通过flush()方法来达到同数据库实时同步

4、删除。把实体从数据库中删除 em.remove(person);

5、刷新实体 refresh() 将数据库中数据从新更新到管理器中的实体(方向是数据库到管理器),是实体更新。而数据库更新。将实体刷新到数据库中则是 flush()(方向是管理器到数据库)此时才是数据库中更新。

6、检测实体是否在被管理中 contans()。

7、改变刷新模式 em.setFlushMode();默认是FlushModeType.AUTO 在查询语句执行前(find和getReference除外)或事务提交时才发生,使用条件是大量更新而没有查询的情况下。 FlushModeType.COMMIT刷新只有在事务提交时才发生,使用条件大量更新中存在查询。

7、主动分离被所有被管理的实体 clear()。可以起到减少内存消耗作用。

8、将实体刷新到数据库中 flush()



命令参数查询

格式为: “:+参数名”
@PersistenceContext
protectedEntityManager em;
...
privateStringNameQuery()...{
// personid
Queryquery=em.createQuery("selectpfromPersonpwherep.personid=:Id");
query.setParameter("Id",newInteger(1));
Listresult=query.getResultList();
StringBufferout=newStringBuffer("***************NameQuery
****************<BR>");
if(result!=null)...{
Iteratoriterator=result.iterator();
while(iterator.hasNext())...{
Personperson=(Person)iterator.next();
out.append(person.getName()+"<BR>");
}
}
return out.toString();
}

位置参数查询

格式为“?+位置编号”

Queryquery=em.createQuery("selectpfromPersonpwherep.personid=?1");

query.setParameter(1,newInteger(1));

Date参数

如果传递的参数是date或calendar类型的则需使用特殊的setParameter


public interface Query
...{
// java.util.Date
Query.setParameter(Stringname,java.util.Datevalue,TemporalTypetemporalType);
// java.util.Calendar
Query.setParameter(Stringname,Calendarvalue,TemporalTypetemporalType);
// java.util.Date
Query.setParameter(intposition,Datevalue,TemporalTypetemporalType);
// java.util.Calendar
Query.setParameter(intposition,Calendarvalue,TemporalTypetemporalType);
}

 
 
 

雅虎收藏夹 百度收藏 Google书签 Yahoo书签 新浪ViVi 搜狐网摘 365Key网摘 天极网摘 diglog 和讯网摘 POCO网摘 YouNote网摘 博拉网 天下图摘 Del.icio.us digg reddit spurl BlinkList blogmarks
发表于: 2008-05-05,已浏览


相关文章