首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

开发单表照射的实体bean 2

2012-08-16 
开发单表映射的实体bean 2?将HelloWorld项目中的build.xml文件拷贝到EntityBean项目下修改其中配置:1.修改

开发单表映射的实体bean 2

?

将HelloWorld项目中的build.xml文件拷贝到EntityBean项目下
修改其中配置:
1.修改项目名称
<project name="EntityBean" basedir=".">
2.修改发布EJB过程
由于JPA规范META-INF下必须存在persistence.xml
添加<metainf>标签,定位到META-INF
使用这个标签可以把META-INF下的所有文件,打包进jar文件的META-INF目录下

<jar ......>
???<metainf dir="${src.dir}\META-INF"></metainf>

</jar>

开发单表照射的实体bean 2


之后运行打包工作(ejbjar)
找到打包后的文件,解压缩打开查看是否存在persistence.xml
做应用时,一定要检查此步骤

?开发单表照射的实体bean 2

打包之后就可以发布了,需要注意:
在persistence.xml中配置了数据源<jta-data-source>
在发布之前,一定要确保数据源文件发布

(用ANT打包EJB时,不能有JUNIT的测试文件类)文章底部会讲解决方案
数据源文件已经发布后,执行deploy工作

?

当实体bean发布成功后,就可以编写客户端调用代码了


PersonService定义的方法比较多,采用单元测试
选中这个接口,点右键new Junit Test Case
将PersonServiceTest文件放在junit.test包下
并勾选setUpBeforeClass()方法,下一步
勾选接口中所有业务方法,完成

?开发单表照射的实体bean 2

在测试中,添加成员变量private static PersonService personService用于接收代理对象

?

将HelloWorld项目src下的jndi.properties文件拷贝到EntityBean项目的src下
再把原先HelloWorld客户端代码,拷贝到beforeClass()中
调用lookUp()查询PersonServiceBean的EJB类
类的远程接口名,默认为简单类名称/remote

?开发单表照射的实体bean 2

这步操作也许会出错,用try-catch捕获异常并输出

?

testSave()方法实现:
personService.save(new Person("小明"));
点左边的红叉子,选择生成构造函数(带参数)
在Person实体Bean中添加带参构造,将name传入
在实体bean中,必须要保留一个无参构造(由JPA规范定义)
如果没有无参构造,使用时会报错

此时就可以测试这个方法了,(操作大纲视图Outline)

?

数据库里成功插入一条,但会出现乱码
当配置数据源时,没有指定编码格式
打开数据源配置文件,修改<connection-url>中
在后面追加

?useUnicode=true&amp;characterEncoding=UTF-8
(如果数据库采用的utf-8)

在MySQL中需要,Oracle中不需要
修改后保存(动态发布)

再执行保存的测试方法,数据库信息显示正常

?

当插入中文字符时会报:Data too long for column
数据库中没有采用中文字符编码
可以使用下面的SQL创建数据库:
create database 'shop' DEFAULT CHARSET=UTF-8

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

testUpdate()方法实现:
先取得Person对象(personService.getPerson()) 也对查找方法进行测试了
再修改该对象的属性
之后调用personService.update();

?

testGetPerson()方法实现:
Person p = personService.getPerson();
syso...p.getName();

?

testDelete()方法实现:
personService.delete(int id);

?

testGetPersons()方法实现:
先插入进几条数据之后
List<Person> persons = personService.getPersons();
for(Person person : persons){
??syso...(person.getName());
}

?开发单表照射的实体bean 2

----------------------------------
有时希望用实体bean的元数据去生成数据库表
在持久化文件中(persistence.xml)的<persistence-unit>标签中
添加:
<properties>
?<!-- 应用发布后自动创建表,解发布后,删除表,做测试时有用;实际开发中,这个属性是

不能设置的?value取值有多个,其中update可以保留数据库中的数据,如果修改了实体bean,也会同步

到数据库表字段-->
?<property name="hibernate.hbm2ddl.auto" value="update" />
?<!-- 显示最终执行的SQL -->
?<property name="hibernate.show_sql" value="true" />
?<!-- 格式化显示的SQL -->
?<property name="hibernate.format_sql" value="true" />
</properties>
属性标签,由于jboss采用Hibernate作为持久化产品,此处设置的属性均为Hibernate

开发单表照射的实体bean 2

修改之后重新发布



测试:
把数据库表删掉(Person)
重新用ANT部署项目,数据库自动生成表

?

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

ANT打包EJB,如果有JUnit测试类,则不编译,解决方案:

原因是:没有在ANT中把单元测试的jar文件设置到classpath中

1.把JUnit 的jar包放到ANT <path>中

2.过滤掉JUnit,不编译单元测试中的类:

在<javac>中加入includes属性

<javac includes="com/**"> 指定编译以com开头的这些类

热点排行