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支持分布式事务