EJB3学习笔记_JPA

来源:互联网 发布:豆瓣电影 知乎 编辑:程序博客网 时间:2024/04/28 16:24

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)

 

原创粉丝点击