EJB3学习笔记_JPA

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名字-->

 

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence" version="1.0"> <persistence-unit name="clat" transaction-type="RESOURCE_LOCAL"><!--持久化单元clat--> <!-- name实体化单元名 transaction-type事务类型 RESOURCE_LOCAL本地事务 JTA全局事务类型,使用容器提供的事务服务--> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!--<jta-data-source>java:DerbyDS</jta-data-source> 如果由容器得到ds ,事务类型选择JTA--> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/> <property name="hibernate.connection.driver_class" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="hibernate.connection.username" value="chat"/> <property name="hibernate.connection.password" value="123456"/> <property name="hibernate.connection.url" value="jdbc:sqlserver://localhost:1433;databaseName=chatroom"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> </properties> </persistence-unit> </persistence>

 

 

4、实体的生命周期图

  • new 内存中新建
  • persist 内存持久化到数据库
  • refresh 数据库数据同步到内存中 DB -> object
  • remove 删除受管状态的实体对应的表,实体还在
  • clear 所有受管的实体都会处于分离状态,脱离上下文
  • close 收回资源,entityManager就不可用了
  • merge 对分离对象调用,根据实体ID更新,并实体再次进入受管状态。如果该ID不存在,会抛异常。

其他一些方法

  • contains 判断对象是否处于受管状态
  • flush 实体向数据库同步 , object -> DB , 虽然将数据写到表中,但事务并未提交,所以还可能被回滚。
  • setFlushMode()/getFlushMode() 刷新模式,AUTO/COMMIT

EJB3学习笔记_JPA_第1张图片

 

 

5、生命周期中对应回调函数的注释(annotations)(apply for entity class methods or in listener class)

     对应 增删改查

  • PrePersist
  • PostPersist
  • PreRemove
  • PostRemove
  • PreUpdate
  • PostUpdate
  • PostLoad

 创建 监听器

package entity; import static java.lang.System.out; import javax.persistence.*; public class AccountListener{ @PrePersist public void prePersist(Account a){out.prinltn("PrePersist:"+ a)}; @PostPersist public void postPersist(Account a){out.prinltn("PostPersist:"+ a)}; @PreUpdate public void preUpdata(Account a){out.prinltn("Preupdate:"+ a)}; @PostUpdate public void postUpdate(Account a){out.prinltn("PostUpdate:"+ a)}; @PostLoad public void postLoad(Account a){out.prinltn("PostLoad:"+ a)}; }

然后注册监听器,绑定到实体上

package entity; import java.io.Serializable; import javax.persistence.*; @Entity @EntityListeners(AccountListener.class) public class Account implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long accountno; private String name; ... }

 

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() 命名查询,如果在一个类中多次使用了一个查询语句,可以给这个语句一个名字,然后调用,只能定义在实体类上

@Entity @EntityListener(AcdountListener.class) @NamedQuery(name="findAll",query="select object(a) from Account a") public class Account implements Serializable{ @Version private int version; @Id @GernerateValue(strategy = GenerationType.AUTO) private long accountno; ... }

 

Query对象:相当于查询语句,用于(添加参数,比如从第几条开始,查几条等)调用方法,返回结果。(具体查API)

 

你可能感兴趣的:(数据库,jpa,ejb,Class,sqlserver,Annotations)