可以通过@PersistenceContext注释由EJB容器动态注入
例:
@PersistenceContext
EntityManager em;
下面介绍EntityManager 常用的API
6.5.1 Entity 获取find()或getReference()
如果知道Entity的唯一标示符,我们可以用find()或getReference()方法来获得Entity。
@PersistenceContext
protected EntityManager em;
…
Person person = em.find(Person.class,1);
/*
try {
Person person = em.getReference (Person.class, 1);
} catch (EntityNotFoundException notFound) {
// 找不到记录...
}
*/
当在数据库中没有找到记录时,getReference()和find()是有区别的,find()方法会返回null,而getReference()方法
会抛出javax.persistence.EntityNotFoundException例外,另外getReference()方法不保证实体Bean已被初始化。
如果传递进getReference()或find()方法的参数不是实体Bean,都会引发IllegalArgumentException例外。
6.5.2 添加persist()
保存Entity到数据库。
@PersistenceContext
protected EntityManager em;
…
Person person = new Person();
person.setName(name);
//把数据保存进数据库中
em.persist(person);
如果传递进persist()方法的参数不是实体Bean,会引发IllegalArgumentException例外。
6.5.3 更新Merge()
通过merge (person)方法可以把Entity Bean更新到数据库。Entity Bean的状态有两种情况。
第一种:Entity Bean仍然受EntityManager 管理,相关更新代码如下:
@PersistenceContext
protected EntityManager em;
…
Jboss EJB3.0实例教程
版权所有:黎活明
public void updatePerson(Person person) {
try {
Person person = em.find(Person.class, 2);
person.setName("lihuoming"); //更新数据
em.merge(person);
} catch (Exception e) {
e.printStackTrace();
}
}
第二种:Entity Bean已经脱离了EntityManager 的管理,相关代码如下:
@PersistenceContext
protected EntityManager em;
…
public Person getPersonByID(int personid) {
return em.find(Person.class, personid);
}
public boolean updatePerson(Person person) {
try {
em.merge(person);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
这种情况的出现一般是把实体Bean返回到了客户端,在客户端对实体Bean作了修改后把他返回给EJB接口进行
更新操作。客户端调用代码如下:
PersonDAO persondao = (PersonDAO) ctx.lookup("PersonDAOBean/remote");
Person person = persondao.getPersonByID(1); //取personid为1的person,此时的person已经脱离容器的管理
person.setName("张小艳");
persondao.updatePerson(person);
这里有一点需要说明,执行updatePerson(person)方法的时候,如果此时容器中已经存在一个受EntityManager 管
理的具有相同ID 的person实例,容器将会把传进的person参数的内容拷贝进这个受管理的实例。merge()方法会
返回这个受管理的实例,但传进updatePerson方法的参数person仍然是分离的不受管理的。还有另外一种情况:
如果此时容器中不存在受EntityManager管理的具有相同ID的person实例,容器将会根据传进的person参数Copy
出一个受EntityManager 管理的person实例,通过这个受管理的实例进行数据库更新操作,同时merge()方法会返
回出这个受管理的实例。传进updatePerson方法的参数person仍然是分离的不受管理的。
如果传递进merge ()方法的参数不是实体Bean,会引发一个IllegalArgumentException例外。
Jboss EJB3.0实例教程
版权所有:黎活明
6.5.4 删除Remove()
把Entity从到数据库中删除。
@PersistenceContext
protected EntityManager em;
…
Person person = em.find(Person.class, 2);
//如果级联关系cascade=CascadeType.ALL,在删除person时候,也会把级联对象删除。把cascade
属性设为cascade=CascadeType.REMOVE 有同样的效果。
em.remove (person);
如果传递进remove ()方法的参数不是实体Bean,会引发一个IllegalArgumentException例外。
6.5.5 执行EJB3 QL 操作createQuery()
除了使用find()或getReference()方法来获得Entity Bean之外,你还可以通过EJB3 QL得到实体Bean。要执行EJB3
QL语句,你必须通过EntityManager 的createQuery()或 createNamedQuery()方法创建一个Query对象。
@PersistenceContext
protected EntityManager em;
…
Query query = em.createQuery("select p from Person p where p. name=’黎明’");
List result = query.getResultList();
Iterator iterator = result.iterator();
while( iterator.hasNext() ){
//处理Person
}
…
// 执行更新语句
Query query = em.createQuery("update Person as p set p.name =?1 where p. personid=?2");
query.setParameter(1, “黎明” );
query.setParameter(2, new Integer(1) );
int result = query.executeUpdate(); //影响的记录数
…
// 执行更新语句
Query query = em.createQuery("delete from Person");
int result = query.executeUpdate(); //影响的记录数
6.5.6 执行SQL 操作createNativeQuery()
注意这里操作的是SQL语句,并非EJB3 QL,千万别搞晕了。
@PersistenceContext
protected EntityManager em;
Jboss EJB3.0实例教程
版权所有:黎活明
…
//我们可以让EJB3 Persistence运行环境将列值直接填充入一个Entity的实例,并将实例作为结果
返回.
Query query = em.createNativeQuery("select * from person", Person.class);
List result = query.getResultList();
if (result!=null){
Iterator iterator = result.iterator();
while( iterator.hasNext() ){
Person person= (Person)iterator.next();
…..
}
}
…
// 直接通过SQL执行更新语句
Query query = em.createNativeQuery("update person set age=age+2");
query.executeUpdate();
6.5.7 刷新实体refresh()
如果你怀疑当前被管理的实体已经不是数据库中最新的数据,你可以通过refresh()方法刷新实体,容器会把数据
库中的新值重写进实体。这种情况一般发生在你获取了实体之后,有人更新了数据库中的记录,这时你需要得到
最新的数据。当然你再次调用find()或getReference()方法也可以得到最新数据,但这种做法并不优雅。
@PersistenceContext
protected EntityManager em;
…
Person person = em.find(Person.class, 2);
//如果此时person对应的记录在数据库中已经发生了改变,可以通过refresh()方法得到最新数据。
em.refresh (person);
如果传递进refresh ()方法的参数不是实体Bean,会引发一个IllegalArgumentException例外。
6.5.8 检测实体当前是否被管理中contains()
contains()方法使用一个实体作为参数,如果这个实体对象当前正被持久化内容管理,返回值为true,否则为false。
如果传递的参数不是实体Bean,将会引发一个IllegalArgumentException例外。
@PersistenceContext
protected EntityManager em;
…
Person person = em.find(Person.class, 2);
if (em.contains(person)){
//正在被持久化内容管理
}else{
//已经不受持久化内容管理
Jboss EJB3.0实例教程
版权所有:黎活明
}
6.5.9 分离所有当前正在被管理的实体clear()
在处理大量实体的时候,如果你不把已经处理过的实体从EntityManager 中分离出来,将会消耗你大量的内存。
调用EntityManager 的clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来。
有一点需要说明下,在事务没有提交前(事务默认在调用堆栈的最后提交,如:方法的返回),如果调用clear()
方法,之前对实体所作的任何改变将会掉失,所以建议你在调用clear()方法之前先调用flush()方法保存更改。
6.5.10 将实体的改变立刻刷新到数据库中flush()
当实体管理器对象在一个session bean 中使用时,它是和服务器的事务上下文绑定的。实体管理器在服务器的事
务提交时提交并且同步它的内容。在一个session bean 中,服务器的事务默认地会在调用堆栈的最后提交(如:
方法的返回)。
@PersistenceContext
protected EntityManager em;
…
public void updatePerson(Person person) {
try {
Person person = em.find(Person.class, 2);
person.setName("lihuoming");
em.merge(person);
//后面还有众多修改操作
} catch (Exception e) {
e.printStackTrace();
}
//更新将会在这个方法的末尾被提交和刷新到数据库中
}
为了只在当事务提交时才将改变更新到数据库中,容器将所有数据库操作集中到一个批处理中,这样就减少了代
价昂贵的与数据库的交互。
当你调用persist( ), merge( )或 remove( )这些方法时,更新并不会立刻同步到数据库中,直到容器决定刷新到数据
库中时才会执行。如果你需要在事务提交之前将更新刷新到数据库中,你可以直接地调用EntityManager.flush()
方法。于是事务管理器将不会在方法的结尾(也就是事务的结尾)处刷新更新到数据库中。这种情况下,你可以手
工地来刷新数据库以获得对数据库操作的最大控制。
@PersistenceContext
protected EntityManager em;
…
public void updatePerson(Person person) {
try {
Person person = em.find(Person.class, 2);
Jboss EJB3.0实例教程
版权所有:黎活明
person.setName("lihuoming");
em.merge(person);
em.flush();//手动将更新立刻刷新进数据库
//后面还有众多修改操作
} catch (Exception e) {
e.printStackTrace();
}
}
6.5.11 获取持久化实现者的引用getDelegate( )
用过getDelegate( )方法,你可以获取EntityManager 持久化实现者的引用,如Jboss EJB3 的持久化产品采用
Hibernate,可以通过getDelegate( ) 方法获取对他的访问,如:
@PersistenceContext
protected EntityManager em;
HibernateEntityManager manager = (HibernateEntityManager)em.getDelegate();
获得对Hibernate的引用后,可以直接面对Hibernate进行编码,不过这种方法并不可取,强烈建议不要使用。
在Weblogic中,你也可以通过此方法获取对Kodo的访问。
分享到:
相关推荐
EJB实体Bean通过JPA(Java Persistence API)或Hibernate等ORM框架与数据库交互。 ### 二、Eclipse中创建和配置EJB实体Bean 1. **新建EJB项目**:在Eclipse中,选择“File” -> “New” -> “Other” -> ...
在学习和实践中,可以通过以下步骤创建一个单表映射的EJB实体Bean: 1. 定义实体类,使用`@Entity`、`@Table`等注解。 2. 注解属性以匹配数据库表的列。 3. 创建`EntityManager`实例,用于操作Bean。 4. 使用`...
ejb3引入了JPA(Java Persistence API),使得实体Bean的使用变得更加简单。实体Bean可以通过继承`javax.persistence.Entity`接口并添加`@Entity`注解来定义。属性可以使用`@Id`注解来指定主键,`@GeneratedValue`...
通过在EJB3实体bean上使用JPA注解,开发者可以直接在bean中定义数据库表结构和字段。这些注解包括`@Entity`(定义实体类)、`@Table`(指定对应的数据库表)、`@Id`(标识主键)、`@GeneratedValue`(自动生成主键)...
EJB3中的EntityBean主要基于JPA(Java Persistence API),采用注解驱动的方式进行对象关系映射(ORM)。`@Entity`注解标记实体类,`@Table`定义映射的数据库表,`@Id`标识主键字段。此外,还有`@GeneratedValue`...
**JPA学习源码(EJB实体Bean)** Java Persistence API(JPA)是Java平台上的一个标准,用于管理和持久化对象。它简化了在关系数据库中存储和检索Java对象的过程,是JAVA EE5中引入的重要组件。JPA通过提供ORM(对象...
在EJB 3中,实体Bean可以作为持久化类使用,它们自动地被JPA管理。这意味着开发者可以利用EJB的容器服务(如事务管理)同时享受JPA带来的数据持久化便利。这种集成让企业级应用的开发变得更加高效和简洁。 ### 核心...
3. **EJB核心规范**: ejb-3_0-fr-spec-ejbcore.pdf可能包含了EJB容器的核心功能,如会话bean、消息驱动bean、实体bean(包括容器管理的持久性 CMP 和Bean管理的持久性 BMT)、以及声明式事务和安全性。 **EJB API**...
EJB3.0另一个重大改变是引入了Java Persistence API(JPA)来替代EJB2.0的实体Bean。JPA允许直接将领域模型类(Domain Model)持久化到数据库,避免了EJB2中实体Bean和Model类之间的转换。EntityManager作为JPA的...
1. **EJB3实体Bean**:创建EJB3实体Bean来代表数据库中的表,这些Bean通常会继承`javax.persistence.Entity`,并使用`@Entity`注解标记。同时,使用`@Table`注解指定对应的数据库表,`@Id`注解标识主键字段。 2. **...
在EJB 3.0中,实体Bean采用了注解驱动的模式,使得无须编写复杂的接口和Home接口,大大简化了实体Bean的定义。 - **会话Bean(Session Bean)**:提供方法来执行业务逻辑,可以分为有状态(Stateful)和无状态...
本文将详细介绍如何在EJB3中使用实体Bean进行增删改查等基本操作,并特别关注EJB3 Query Language (EJB3QL)这一强大的查询工具。 #### 二、EJB3QL简介 EJB3QL是一种面向对象的查询语言,它类似于SQL,但更加面向...
EJB3的核心特性包括实体Bean(Entity Beans)、会话Bean(Session Beans)和消息驱动Bean(Message-Driven Beans),其中实体Bean主要负责持久化操作。 二、EJB3持久化 EJB3的持久化特性基于Java Persistence API...
1. **实体Bean (Entity Beans)**:代表持久化的数据对象,EJB3中实体Bean使用了JPA(Java Persistence API)进行持久化管理,使得ORM(对象关系映射)更为简便。 2. **会话Bean (Session Beans)**:处理业务逻辑,...
JPA的核心是EntityManager,它管理着实体对象的生命周期,并提供了丰富的API来执行数据库操作。此外,EJB 3还支持Criteria API,这是一种类型安全的方式来构建查询,使得构建动态查询变得更加容易。 在EJB 3的实际...
【EntityManager】是Java JPA(Java Persistence API)中的核心组件,负责管理Java对象与数据库之间的映射关系,实现ORM(Object-Relational Mapping)功能。它充当了一个中间层,简化了对数据库的操作,使得开发者...
在EJB2中,实体Bean的生命周期和事务管理需要通过复杂的部署描述符和代码来实现,而EJB3则通过注解和元数据驱动的方式,让这些操作变得更加简单直观。JPA的引入,意味着开发者可以专注于业务逻辑的编写,而无需关心...
1. 实体Bean(Entity Beans):在EJB3中,实体Bean通常使用JPA(Java Persistence API)进行持久化,通过注解如`@Entity`、`@Table`、`@Id`等,可以轻松地定义实体类和数据库表之间的映射。实体管理器...
- **POJO(Plain Old Java Object)风格的开发**:EJB3允许开发者将EJB组件实现为普通的Java类,这极大地降低了学习成本并提高了开发效率。 - **注解支持**:EJB3引入了注解来配置EJB组件的行为,简化了配置过程。 -...
3. **创建EJB实体Bean**:定义EJB接口和实现类,使用@Stateless或@Stateful注解,根据需求选择会话Bean类型。 4. **注入EntityManager和EntityManagerFactory**:在EJB Bean中使用@PersistenceContext或@Persistence...