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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值