【转载】关于EJB3.0

来源:互联网 发布:mac airplay在哪里 编辑:程序博客网 时间:2024/06/06 04:35

EJB3.0
一、EJB3.0

 1、依赖注入:通过声明的方式来获取对象
 2、使用java annotation 替代ejb-jar.xml
 3、在ejb3.0中既可以使用annotation,也可以使用xml文件来描述,但是xml优先
二、JPA(java persistance api)
 1、sun制定的标准的持久化的API
 2、使用jpa开发的应用程序可以使用所有的支持jpa的持久层框架

 3、使用jpa的步骤:
  1)、配置文件persiatance.xml(描述持久化提供者-Persistance Provider和数据库链接的相      关信息)
  2)、Entity(通过Annoptation描述)
  3)、创建PersistanceProvider对象,读取配置文件的信息
  4)、创建EntityManagerFactory对象
  5)、创建EntityManager对象(PersistanceContext持久化上下文)
 
三、配置持久性单元(persistence.xml)
 需要指定:
  1、持久化提供者(Persistence Provider)
  2、跟数据库的连接信息(DataSource的jndi名)

四、Entity
 1.在实体类中描述实体类跟数据库表之间的映射关系
 2.实体不是ejb组件
 3.实体是一个pojo对象
 4.在实体类中可以通过annotation声明
 5.实体被实体管理器管理

五、EntityManager
 1、应用创建
  1)、创建持久化提供者
  2)、通过持久化提供者创建EntityManagerFactory对象
  3)、通过EntityManagerFactory创建EntityManager

 2、容器创建
  1)、提供给ejb容器一个persistence.xml文件
  2)、容器根据persistence.xml文件中描述的信息创建EntityManager
六、几个重要的概念
 1.持久性单元(PersistenceUnit):在persistence.xml中描述的信息
 2.持久化提供者(PersistnceProvider)
  指的是ORM框架提供的一个类型,通过这个类型可以创建EntityManagerFactory对象
 3.持久化上下文(PersistnceContext)
  1)指的是EntityManager对象内部维护的一个缓存
  2)与事务相关:当事务启动的时候创建持久化上下文,当事务结束的时候持久化上下       文消失
  3)与无状态会话bean结合使用
  4)扩展的持久化上下文:当事务启动的时候创建持久化上下文,当事务结束的时候持       久化上下文消失,与有状态会话bean结合使用
 4.实体管理器工厂(EntityManagerFactory)
  指的是用于创建EntityManager对象的一个工厂对象
 5.实体管理器(EntityManager)
  指的是用于对实体对象进行增删改查的对象
 6.方法说明:
  persist():将一个new状态的对象变成持久状态
  refresh():将数据库中记录重新读取一遍
  remove():将managed状态的对象变成removed状态
  merge():将detached状态的对象变成managed状态
 7.在JPA中与数据库同步的两种模式:
  调用EntityManager的setFlushMode的方法可以更改刷新模式,刷新模式在在FlushModeType这个枚举类型中定义
  1)FlushModeType.AUTO(default):在作查询操作以及事务提交的时候刷新
  2)FlushModeType.COMMIT:事务提交的时候刷新
 8.@remove
  使用Remove这个annotation进行标注的方法的作用是:当客户端调用这个方法,容器会回收有状态会话bean的bean对象,但是如果调用的时候发生异常,这是容器不会回收bean对象
  1)当@Remove(retainIfException=false)的时候,容器会回收对象
  2)当@Remove(retainIfException=true)的时候,容器不会回收对象
七、在ejb3.0中注入对象的种类:
 1、资源:@Resource
 2、EJB:@EJB
 3、实体管理器:@PersistenceContext
八、在ejb3.0中注入对象的方式:
 1、属性层面的注入:
  @Resource
  private SessionContext sc;
 2、方法层面的注入:
  @Resource(jndi="jdbc/ds")
  public void setDataSource (DataSource ds){
   this.ds=ds;
  }
 3、类层面的注入:
  @Rsources({
  
  })
  public class A implements B{
  
  }
九、EJB-QL增强
 1、批量更新、删除
  1)语法:a、delete from 实体名
           b、update 实体名 别名 set 别名.属性名=value
         2)特点:
   a、批量删除和更新作用于实体本身和它所有的子类实体
   b、批量删除和更新不会作用于和它关联的实体
   c、批量更新的值类型要跟数据库中的字段保持一致
   d、批量更新直接作用于数据库,乐观锁失效
   e、批量更新和删除可能会导致持久化上下文和数据库中的数据不同步
 2、join operation:
  1)inner join(把所有有关联的数据查询出来)
   a、语法:select c from Company c join c.employee e
  2)left join(把所有的数据都查询出来)
   a、语法:select c from Company c left join c.employee e
  3)fetch join(使用预先加载)
   a、语法:select c from Company c left join fetch c.employee e

 3、gruop by和having
  1)所有出现在select后面的不使用组函数的属性必须出现在group by子句中
         2)如果条件中使用组函数必须使用having
  3)如果使用having子句,必须使用group by子句
 
 4、投影操作(Projection)
  语法:select c.name,c.age from Company c
 
 5、子查询:
  语法:select c from company c where (select count(e)from c.employee e)>0

 6、在select 语句中构造对象
  语法:select new Company(c.id,c.name)from Company c
  注意:1.需要提供对应参数的构造器
        2.如果要在网络上进行传输,还需要实现序列化接口

十、事务(Transaction)
 1、基本概念
  a、事务化对象:运行在事务中的对象
  b、事务管理器:管理事务的对象
  c、资源:数据库(持久化数据存储器)
  d、资源管理器:数据库驱动
 2、嵌入式事务
  由一个主事务和若干个子事务组成,单个子事务回滚不会影响主事务
 3、平面事务
  
 4、ejb中的事务
  1)根据事务边界的划分者的不同:
   a、声明型事务(CMT):容器生成的包装类对象去划分事务的边界
   b、编程型事务(BMT):bean对象去划分事务的边界
   c、客户端初始化事务:ejb的调用者去划分事务边界

  2)在EJB使用容器管理事务的情况下:
   EJB的客户端的事务和EJB的事务的关系
   通过指定事务传播属性来决定客户端事务和EJB事务之间的关系
 
 5、分布式事务
  两阶段提交过程:
       1)、当调用UserTransaction的commit方法,由一个事务协调者(由服务器提供)处理这个提交过程

       2)、首先给参与事务的资源管理器发起一个准备提交事务的请求;

       3)、每一个资源管理器返回一个结果给协调者

       4)、如果有任何一个资源管理器返回结果为事务不能正常提交,事务协调者会回滚整个事务

       5)、如果都允许正常提交,事务协调者就将所做的操作记录到日志文件中去,防止以外情况的发生。

       6)、事务协调者发起第二阶段的提交,进入这个阶段事务肯定是提交的,当提交完毕之后,每一个资源管理器都会返回一个结果,如果有任何一个资源管理器所做的操作没有成功,则根据日志文件中的记录重新执行。

 6、在EJB3.0中使用分布式事务
  1)在Persistence.xml中声明多个持久性单元,每个持久性单元使用的DataSource连接不同的数据库

  2)在会话bean中根据不同的持久性单元注入多个EntityManager,每个EntityManager访问不同的数据库

  3)在会话bean的商业方法中通过多个实体管理器来访问多个数据库

  4)在ejb3.0中我们使用的事务是JTA事务,本身就支持分布式事务管理,所以对分布式事务处理在代码上并不会跟以往有什么不同

  5)使用分布式事务的前提:
   a、使用的数据库必须支持分布式事务
   b、配置的的DataSource支持分布式事务

原创粉丝点击