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

本文介绍了如何在Java Persistence API (JPA)中配置persistence.xml文件,并详细讲解了EntityManager的使用方法,包括实体的查询、保存、更新、删除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

配置文件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);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值