1、简介:EJB 过去用EntityBean,在EJB3后不推荐使用,而是用JPA代替。
2、JPA简介
3、规范
配置persistence.xml,放在META-INF下
注:在eclipse中定义xsd: Preferences - Files and Edite - XML - XML Category - add - Location(找到xsd) - key 上也配置斜杠后的名称与Location一致。
这样就省去了xml头的声明,也无需一直连接网络,创建的时候由Schema中创建,选中对应的xsd。
关于数据库:
注意:在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、实体的生命周期图
其他一些方法
5、生命周期中对应回调函数的注释(annotations)(apply for entity class methods or in listener class)
对应 增删改查
创建 监听器
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、查询方法
@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)