1、简介:EJB 过去用EntityBean,在EJB3后不推荐使用,而是用JPA代替。
2、JPA简介
- 对流行的ORM框架做了抽象,做到更一般化,抽象了各框架中的交叉部分,所以没有特定框架来得强大
- JPA不提供实现,委托具体产品实现
3、规范
配置persistence.xml,放在META-INF下
注:在eclipse中定义xsd: Preferences - Files and Edite - XML - XML Category - add - Location(找到xsd) - key 上也配置斜杠后的名称与Location一致。
这样就省去了xml头的声明,也无需一直连接网络,创建的时候由Schema中创建,选中对应的xsd。
关于数据库:
- 过去单一应用时,我们使用配置文件设定数据库url,name等直接访问数据库
- 现在在容器中,应该让容器去连接数据库,然后给我们数据源(ds)
注意:在jboss中连接数据库,就是将数据库驱动jar 和 数据库连接的xml文件 都放到deploy中, 然后通过JNDI去访问这个DS。
然后在persistence.xml中 添加 <jta-data-source>java:DerbyDS</jta-data-source> <!--这里就是JNDI名字-->
4、实体的生命周期图
- new 内存中新建
- persist 内存持久化到数据库
- refresh 数据库数据同步到内存中 DB -> object
- remove 删除受管状态的实体对应的表,实体还在
- clear 所有受管的实体都会处于分离状态,脱离上下文
- close 收回资源,entityManager就不可用了
- merge 对分离对象调用,根据实体ID更新,并实体再次进入受管状态。如果该ID不存在,会抛异常。
其他一些方法
- contains 判断对象是否处于受管状态
- flush 实体向数据库同步 , object -> DB , 虽然将数据写到表中,但事务并未提交,所以还可能被回滚。
- setFlushMode()/getFlushMode() 刷新模式,AUTO/COMMIT
5、生命周期中对应回调函数的注释(annotations)(apply for entity class methods or in listener class)
对应 增删改查
- PrePersist
- PostPersist
- PreRemove
- PostRemove
- PreUpdate
- PostUpdate
- PostLoad
创建 监听器
然后注册监听器,绑定到实体上
6、并发控制逻辑
JPA提供的支持:乐观锁 和 显示的读和写锁
乐观锁:不对表中记录加任务实际的锁,是假设没有其他人会并发修改记录,如果发现被修改了就抛异常,避免不可重读
实现机制是:使用标记了@Version的属性(该属性只能是int,Inter,short,long,Long,Timestamp)是否变更异常做判断。
显示的读和写锁:显示得告知数据库应该提供锁
EntityManager.lock(Object entity, LockModeType lockMode) //模式类型有 READ 和 WRITE
EJB规范中指出 此类锁支持提供@Version属性的实体,但并不强制。
读锁(READ): 可以避免脏读和不可重读。
写锁(WRITE):在读锁基础上,对数据的更新会 使Version属性+1,如果Version值不对就抛出异常。
7、查询方法
- EntityManager.find() 根据主键查询
- EntityManager.createQuery() 使用ejb的 查询语言(类似HQL这种)
- EntityManager.createNativeQuery(String sql,Class clazz) 使用SQL查询
- EntityManager.createNamedQuery() 命名查询,如果在一个类中多次使用了一个查询语句,可以给这个语句一个名字,然后调用,只能定义在实体类上
Query对象:相当于查询语句,用于(添加参数,比如从第几条开始,查几条等)调用方法,返回结果。(具体查API)