开发单表映射的实体bean 1

实体bean
它属于java持久化规范(JPA)里的技术,实体bean通过元数据在javaBean和数据库之间建立起映射关系,然后java程序员就可以随心所欲的使用面向对象的编程思想来操纵数据库。JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,目前实现的JPA规范的主流产品有Hibernate、TopLink和openJPA,在jboss中采用了Hibernate作为其持久化实现产品

 

添加JPA的配置文件persistence.xml
根据JPA规范的要求:在实体bean应用中,我们需要在应用的类路径下的META-INF目录加入持久化配置文件persistence.xml

<?xml version="1.0"?>
<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_1_0.xsd" version="1.0">

</persistence>

 

新建java Project项目: EntityBean,将jboss\client目录下的jar包导入进工程

在src目录下,建立新目录:META-INF目录

在META-INF中,建立persistence.xml文件

开发单表映射的实体bean <wbr>1

-----------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<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_1_0.xsd" version="1.0">
 
 <!-- 首先定义持久化单元(一堆实体类的集合) -->
 <!-- JTA代表全局事务(默认),RESOURCE_LOCAL代表本地事务 -->
 <persistence-unit name="ejbtest" transaction-type="JTA">
 
  <!-- 指定要使用的数据源的JNDI名称 -->
  <jta-data-source>java:OracleDS</jta-data-source>
  
 </persistence-unit>
 
</persistence>

-----------------------------------------------------------------

找到配置好的数据源文件jboss\server\default\deploy\*-ds.xml
找到<jndi-name>定义的JNDI名称,复制它,拷贝到<jta-data-source>中
由于数据源发布到jboss中,jboss会给它默认命名空间为java:
所以完整写上java:OracleDS
如果不写java: 则jboss会默认去全局中寻找该JNDI名称,显然是找不到的
持久化单元配置完成

在持久化文件(persistence.xml)中可以配置多个持久化单元

 

之后开发实体bean,查看数据库表person,有两个字段:id和name
其中id是主键,采用序列自增;name为varchar2(20) not null
建立与person表映射的javaBean,Person类(com.jboss.bean包)

 

采用注解方式映射的开发效率要比XML配置文件效率要高
如果javaBean中没有指定@Id 则运行是会报错
当应用移植数据库时,@GeneratedValue(strategy=GenerationType.AUTO),默认也是auto
设置name属性为length=20,nullable=false
远程访问EJB时,需要实现序列化接口

比较两个Person对象是否相等,需要用主键id判断,重写equals、hashCode()方法

 开发单表映射的实体bean <wbr>1

 开发单表映射的实体bean <wbr>1

Person类会有一个警告,没有生成版本ID号
点击感叹号,选择第二项:Add Generated serial version ID

当这个实体bean开发完后,需要对它进行添加增删改查操作

 

要完成对实体bean的增删改查,要用到EntityManager管理这个实体bean对象
EntityManager能应用在 消息bean和会话bean

 

新建包:com.jboss.service 新建接口PersonService
在接口中定义,增删改查 方法 (5个方法)

 开发单表映射的实体bean <wbr>1

新建包:com.jboss.service.impl 新建实现类PersonServiceBean
在该类中实现PersonService方法

首先把这个bean变成一个无状态会话bean
然后把接口定义为远程接口
通过@PersistenceContext注解,注入实体管理器EntityManager对象
@PersistenceContext注解,unitName属性,用于指定持久化单元(persistence.xml中定义的)
当persistence.xml中,配置的持久化单元只有一个时,这里可以省略不写unitName属性

--------------------

开发单表映射的实体bean <wbr>1
开发单表映射的实体bean <wbr>1

Person getPerson(Integer person_id)方法实现:
通过em.find(实体类.class , @Id的字段)
会根据给定的 @Id的字段 获取实体类对象
em.find(Person.class,person_id)
当数据库没有找到person_id对应的对象时,则返回null

 

List<Person> getPersons()方法实现:
em.createQuery("使用EJBQL语句查询(对象查询)").getResultList();
对象和对象的属性区分大小写
getResultList() 返回一个List
此时会有一个警告,由于定义的是返回泛型,而getResultList()返回的是List
在EJBQL语句中,已知道是查询的Person对象,此时可以用@SuppressWarnings("unchecked")
消除警告

 

void save(Person person)方法实现:
em.persist(person); 进行保存,对象应该处于新建状态的实体
在实体bean中有4种状态:
1.新建状态
2.托管状态
3.游离状态
4.删除状态
调用 em.persist(person); 时会往数据库添加一条新的记录
是把这个对象里的属性值,保存到对应的数据表的对应字段,而不是保存整个对象

 

void update(Person person)方法实现:
调用em.merge(person);
调用前有一个前提:当person处于游离状态时,才可用
如果这个实体bean(person) 处于托管状态,并且和一个事务关联了以后,不需要调用这个方法
直接调用托管状态的set方法即可修改,而无须调用merge()

 

void delete(Integer person_id)方法实现:
em.remove(); 这个实体bean对象处于托管状态下才能删

采用em.find(Person.class,person_id) 方法得到一个person实体bean
再把person实体bean传入em.remove()是可以的

这里采用em.remove(em.getReference(Person.class,person_id))
getReference(Person.class,person_id)返回的是一个代理对象 (延迟加载)
也就是调用完这个方法后,不会立即发送数据装载动作,访问它的属性时,才会进行数据装载
此时不需要状态数据,只是删除这个对象,所以得到一个托管的实体bean对象就OK了

所以采用getReference(Person.class,person_id)方法,比find(Person.class,person_id)方法性能要

好(不需要数据装载)

如果getReference()去数据库中没有查到记录,则抛出异常
find()则是返回null

现在完成了业务方法之后,对这个应用进行打包并发布

Person类会有一个警告,没有生成版本ID号
点击感叹号,选择第二项:Add Generated serial version ID

此时,会话bean已编写好、实体bean也完成了

开发单表映射的实体bean <wbr>1

猜你喜欢

转载自leon-s-kennedy.iteye.com/blog/1538319