在EJB 3.0 学习笔记——准备工作中只是简单的搭好了EJB3.0开发的基本环境,之
后就可以开发最简单的Session Bean了,我感兴趣的还是Entity Bean,所以接下来
我想先试验一下Entity Bean。
一、在JBoss中配置好Data Source
我使用的是MySQL数据库,所以首先将MySQL的JDBC驱动复制到
jboss-4.0.3SP1\server\all\lib目录,然后将jboss-4.0.3SP1\docs\examples\jca
下的mysql-ds.xml作出适当修改后复制到jboss-4.0.3SP1\server\all\deploy目录
下,这是我修改后的mysql-ds.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mysql-ds.xml,v 1.3.2.1 2004/12/01 11:46:00 schrouf Exp $ -->
<!-- Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
-->
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/test</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>test</user-name>
<password></password>
<exception-sorter-class-
name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</excepti
on-sorter-class-name>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->
<!-- sql to call on an existing pooled connection when it is obtained
from pool
<check-valid-connection-sql>some arbitrary sql</check-valid-
connection-sql>
-->
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml
(optional) -->
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
这样之后,JBoss下的MySQL Data Source配置完成。
二、创建数据库并编写Entity Bean代码
create table book(
id int not null auto_increment primary key,
title varchar(20) not null,
author varchar(40) not null
);
新建Java Project,导入User Library:EJB3_JBoss,以下是类代码。
//Book.java
package ejb.bean.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="book")
public class Book implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String title;
private String author;
public Book() {
super();
}
public Book(Integer id, String title, String author) {
super();
this.id = id;
this.title = title;
this.author = author;
}
@Override
public String toString() {
return "Book: " + getId() + " Title " + getTitle() + "
Author " + getAuthor();
}
public String getAuthor() {
return author;
}
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public String getTitle() {
return title;
}
public void setAuthor(String author) {
this.author = author;
}
public void setId(Integer id) {
this.id = id;
}
public void setTitle(String title) {
this.title = title;
}
}
三、编写一个简单的Stateless Session Bean 并进行测试
//BookTestLocal.java
package ejb.bean.entity;
import javax.ejb.Local;
@Local
public interface BookTestLocal {
public void test();
}
//BookTestRemote.java
package ejb.bean.entity;
import javax.ejb.Remote;
@Remote
public interface BookTestRemote {
public void test();
}
//BookTestBean.java
package ejb.bean.entity;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class BookTestBean implements BookTestLocal, BookTestRemote {
@PersistenceContext
EntityManager em;
public void test() {
// TODO Auto-generated method stub
Book book = new Book(null, "My first bean book",
"Sebastian");
em.persist(book);
}
}
//Client.java
package ejb.client.entity;
import ejb.bean.entity.*;
import javax.naming.InitialContext;
/**
* Comment
*
* @author <a href="mailto:bill@jboss.org">Bill Burke</a>
* @version $Revision: 1.1.6.7 $
*/
public class Client
{
public static void main(String[] args) throws Exception
{
InitialContext ctx = new InitialContext();
BookTestRemote book = (BookTestRemote) ctx.lookup
("BookTestBean/remote");
book.test();
System.out.println("test successful! ");
}
}
三、其他文件
将jboss-EJB-3.0_RC5-PFD\docs\tutorial中的找到的jndi.properties、log4j.xml
、builder.xml等复制到当前工程中,其中builder.xml需要修改。
//builder.xml
<?xml version="1.0"?>
<!--
=======================================================================
-->
<!-- JBoss build file
-->
<!--
=======================================================================
-->
<project name="JBoss" default="ejbjar" basedir=".">
<property file="../local.properties" />
<property environment="env"/>
<property name="src.dir" value="${basedir}/src"/>
<property name="jboss.home" value="E:/Programming/Servers/jboss-
4.0.3SP1/"/>
<property name="jboss.server.config" value="all"/>
<property name="build.dir" value="${basedir}/build"/>
<property name="build.classes.dir" value="${build.dir}/classes"/>
<!-- Build classpath -->
<path id="classpath">
<!-- So that we can get jndi.properties for InitialContext -->
<pathelement location="${basedir}"/>
<fileset dir="${jboss.home}/lib">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${jboss.home}/server/${jboss.server.config}/lib">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${jboss.home}/server/
${jboss.server.config}/deploy/ejb3.deployer">
<include name="*.jar"/>
</fileset>
<fileset dir="${jboss.home}/server/
${jboss.server.config}/deploy/jboss-aop-jdk50.deployer">
<include name="*.jar"/>
</fileset>
<pathelement location="${build.classes.dir}"/>
</path>
<property name="build.classpath" refid="classpath"/>
<!--
=================================================================== -->
<!-- Prepares the build directory
-->
<!--
=================================================================== -->
<target name="prepare">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes.dir}"/>
</target>
<!--
=================================================================== -->
<!-- Compiles the source code
-->
<!--
=================================================================== -->
<target name="compile" depends="prepare">
<javac srcdir="${src.dir}"
destdir="${build.classes.dir}"
debug="on"
deprecation="on"
optimize="off"
includes="**">
<classpath refid="classpath"/>
</javac>
</target>
<target name="ejbjar" depends="compile">
<jar jarfile="build/tutorial.jar">
<fileset dir="${build.classes.dir}">
<include name="**/*.class"/>
</fileset>
<fileset dir=".">
<include name="META-INF/persistence.xml"/>
</fileset>
</jar>
<copy file="build/tutorial.jar" todir="${jboss.home}/server/
${jboss.server.config}/deploy"/>
</target>
<target name="run.stateless" depends="ejbjar">
<java classname="ejb.client.stateless.Client" fork="yes" dir=".">
<classpath refid="classpath"/>
</java>
</target>
<target name="run.stateful" depends="ejbjar">
<java classname="ejb.client.stateful.Client" fork="yes"
dir=".">
<classpath refid="classpath"/>
</java>
</target>
<target name="run.timer" depends="ejbjar">
<java classname="ejb.client.timer.Client" fork="yes"
dir=".">
<classpath refid="classpath"/>
</java>
</target>
<target name="run.entity" depends="ejbjar">
<java classname="ejb.client.entity.Client"
fork="yes" dir=".">
<classpath refid="classpath"/>
</java>
</target>
<!--
=================================================================== -->
<!-- Cleans up generated stuff
-->
<!--
=================================================================== -->
<target name="clean.db">
<delete dir="${jboss.home}/server/
${jboss.server.config}/data/hypersonic"/>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
<delete file="${jboss.home}/server/
${jboss.server.config}/deploy/tutorial.jar"/>
</target>
</project>
最后,在工程目录下新建目录META-INF,在目录META-INF新建persistence.xml文件
,以下是文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="test">
<jta-data-source>java:/MySqlDS</jta-data-source>
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
四、运行测试
run as->ant build后,选择运行目标为run.entity->run。
运行结果:
Buildfile: D:\Programs\Java\EclipseWork\EJB3\build.xml
prepare:
compile:
ejbjar:
run.entity:
[java] test successful!
BUILD SUCCESSFUL
Total time: 9 seconds
MySQL中select * from book;
id title author
1 My first bean book Sebastian
已经成功写入。