配置文件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);
}