开发单表映射的实体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文件
-----------------------------------------------------------------
<?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()方法
Person类会有一个警告,没有生成版本ID号点击感叹号,选择第二项:Add Generated serial version ID
当这个实体bean开发完后,需要对它进行添加增删改查操作
要完成对实体bean的增删改查,要用到EntityManager管理这个实体bean对象EntityManager能应用在 消息bean和会话bean
新建包:com.jboss.service 新建接口PersonService在接口中定义,增删改查 方法 (5个方法)
新建包:com.jboss.service.impl 新建实现类PersonServiceBean在该类中实现PersonService方法
首先把这个bean变成一个无状态会话bean
然后把接口定义为远程接口
通过@PersistenceContext注解,注入实体管理器EntityManager对象
@PersistenceContext注解,unitName属性,用于指定持久化单元(persistence.xml中定义的)
当persistence.xml中,配置的持久化单元只有一个时,这里可以省略不写unitName属性--------------------
Person getPerson(Integer person_id)方法实现:
通过em.find(实体类.class,@Id的字段)
会根据给定的@Id的字段获取实体类对象
em.find(Person.class,person_id)
当数据库没有找到person_id对应的对象时,则返回nullList<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也完成了