开发单表映射的实体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"?>

<persistencexmlns="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 1

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

<?xml version="1.0" encoding="UTF-8"?>

<persistencexmlns="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-unitname="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)notnull

建立与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 1

 开发单表映射的实体bean 1

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

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

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

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

 开发单表映射的实体bean 1

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

首先把这个bean变成一个无状态会话bean

然后把接口定义为远程接口

通过@PersistenceContext注解,注入实体管理器EntityManager对象

@PersistenceContext注解,unitName属性,用于指定持久化单元(persistence.xml中定义的)

当persistence.xml中,配置的持久化单元只有一个时,这里可以省略不写unitName属性

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

开发单表映射的实体bean 1开发单表映射的实体bean 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 1

相关推荐