编写一个EJB3的 Entity EJB

1,首先要建立数据库相关的表。下面转一个网上的资料。省得一点点写麻烦:) 

一.
Jboss有一个默认的数据源DefaultDS,他使用Jboss内置的HSQLDB数据库。实际应用中你可能使用不同的
数据库,如MySql、MsSqlServer、Oracle等。各种数据库的数据源配置模版你可以在[Jboss安装目
录]\docs\examples\jca 目录中找到,默认名称为:数据库名+ -ds.xml 。
不管你使用那种数据库都需要把他的驱动类Jar 包放置在[Jboss 安装目录]\server\all\lib 目录下,放

置后需要启
动Jboss服务器。
本教程使用的数据库是mysql-5.0.22 和Ms Sql Server2000 ,使用驱动Jar 包如下:
Mysql :mysql-connector-java-3.1.13-bin.jar
Ms Sql Server2000 :msbase.jar, mssqlserver.jar, msutil.jar

下面介绍Mysql的数据源配置,数据源配置文件的取名格式必须为 xxx–ds.xml ,如:
mysql-ds.xml ,mssqlserver-ds.xml,oracle-ds.xml 。
数据源文件配置好后需要放置在[jboss安装目录]/server/config-name/deploy目录下,本教程采用的配置名为:all,
所以路径为[jboss安装目录]/server/all/deploy目录

下面定义一个名为DefaultMySqlDS的Mysql数据源,连接数据库为foshanshop,数据库登录用户名为root,密码为123456,数据库驱动类为org.gjt.mm.mysql.Driver。大家只需修改数据库名及登录用户名密码就可以

直接使用。
mysql-ds.xml
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>DefaultMySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/foshanshop?

useUnicode=true&amp;characterEncoding=GBK
</connection-url>
<driver-class>org.gjt.mm.mysql.Driver</driver-class>
<user-name>root</user-name>
<password>123456</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
二.
1. 配置数据源并放置在[jboss 安装目录]/server/all/deploy 目录,把数据库驱动Jar 包放置在[Jboss

安装目录]\server\all\lib 目录下,放置后需要重启Jboss服务器。如果数据源已经存在就不需要配置。
2. 配置persistence.xml文件,在文件中指定使用的源据源及各项参数。
3. 把实体类和persistence.xml文件打成Jar,persistence.xml 放在jar 文件的META-INF目录

切记一点,在persistence.xml中的

<jta-data-source>java:/DefaultMySqlDS</jta-data-source>千万不能写成

<jta-data-source>DefaultMySqlDS</jta-data-source>否则发布Entity EJB时,就会报错


三.
开发前先介绍需要映射的数据库表
person
字段名称 字段类型属性 描述
personid (主键) Int(11) not null 人员ID
PersonName Varchar(32) not null 姓名
sex Tinyint(1) not null 性别
age Smallint(6) not null 年龄
birthday datetime null 出生日期
建立与Person表进行映射的实体Bean
package com.foshanshop.ejb3.bean;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.GenerationType;

@SuppressWarnings("serial")
@Entity
@Table(name = "Person")
public class Person implements Serializable{

    private Integer personid;
    private String name;   
    private boolean sex;
    private Short age;
    private Date birthday;
 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Integer getPersonid() {
        return personid;
    }
    public void setPersonid(Integer personid) {
        this.personid = personid;
    }
   
    @Column(nullable=false,length=32)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
   
    @Column(nullable=false)
    public boolean getSex() {
        return sex;
    }
    public void setSex(boolean sex) {
        this.sex = sex;
    }
   
    @Column(nullable=false)  
    public Short getAge() {
        return age;
    }
    public void setAge(Short age) {
        this.age = age;
    }
   
    @Temporal(value=TemporalType.DATE)
    public Date getBirthday() {
        return birthday;
    }
   
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
为了使用上面的实体Bean,我们定义一个Session Bean作为他的使用者。下面是Session Bean 的业务接,他定
义了两个业务方法insertPerson和getPersonNameByID,insertPerson用作添加一个Person,

getPersonNameByID 根
据personid获取人员的姓名。
PersonDAO.java
package com.foshanshop.ejb3;
import java.util.Date;
public interface PersonDAO {
public boolean insertPerson(String name, boolean sex,short age, Date birthday);
public String getPersonNameByID(int personid);
}
下面是Session Bean的实现
PersonDAOBean.java
package com.foshanshop.ejb3.impl;

import java.util.Date;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.foshanshop.ejb3.PersonDAO;
import com.foshanshop.ejb3.bean.Person;

@Stateless
@Remote (PersonDAO.class)
public class PersonDAOBean implements PersonDAO {

    @PersistenceContext
    protected EntityManager em;

    public String getPersonNameByID(int personid) {
        Person person = em.find(Person.class, Integer.valueOf(personid));
        return person.getName();
    }

    public boolean insertPerson(String name, boolean sex,short age, Date birthday) {
        try {
            Person person = new Person();
            person.setName(name);
            person.setSex(sex);
            person.setAge(Short.valueOf(age));
            person.setBirthday(birthday);
            em.persist(person);//添加数据用persist
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public Person getPersonByID(int personid) {      
        return em.find(Person.class, personid);
    }
   
    public boolean updatePerson(Person person) {
        try {
            em.merge(person);//更新数据用merge
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
   
    public List getPersonList() {
         Query query = em.createQuery("from Person order by personid asc");
         List list = query.getResultList();
         return list;       
    }
}

上面我们使用到了一个对象:EntityManager em,EntityManager 是由EJB容器自动地管理和配置的,不

需要用户
自己创建,他用作操作实体Bean。关于他的更多介绍请参考持久化实体管理器EntityManager。
上面em.find()方法用作查询主键ID 为personid的记录。em.persist()方法用作向数据库插入一条记录。

大家可能感
觉奇怪,在类中并没有看到对EntityManager em进行赋值,后面却可以直接使用他。这是因为在实体Bean

加载
时,容器通过@PersistenceContext注释动态注入EntityManager 对象。
如果persistence.xml文件中配置了多个不同的持久化内容。你需要指定持久化名称注入EntityManager

对象,可以
通过@PersistenceContext注释的unitName属性进行指定,例:
@PersistenceContext(unitName="foshanshop")
EntityManager em;
如果只有一个持久化内容配置,不需要明确指定。
下面是persistence.xml文件的配置:
<persistence>
<persistence-unit name="foshanshop">
<jta-data-source>java:/DefaultMySqlDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
把他打成
Jar 文件并发布到Jboss中。
在发布前请检查persistence.xml 文件中使用的数据源是否配置
出现下面这种异常往往是没在数据库中建立foshanshop表或没在数据源中加入<property

name="dialect">org.hibernate.dialect.SQLServerDialect</property>这样的话
ObjectName: persistence.units:jar=EntityBean.jar,unitName=foshanshop
  State: FAILED
  Reason: javax.persistence.PersistenceException: org.hibernate.HibernateException:

Hibernate Dialect must be explicitly set
  I Depend On:
    jboss.jca:service=DataSourceBinding,name=DefaultMySqlDS
  Depends On Me:
    jboss.j2ee:jar=EntityBean.jar,name=PersonDAOBean,service=EJB3
当实体bean 发布成功
后,我们可以查看数据库中是否生成了Person 表,
下面是JSP 客户端代码:
EntityBeanTest.jsp
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="com.foshanshop.ejb3.PersonDAO,
javax.naming.*,
java.util.Properties,
java.util.Date,
java.text.SimpleDateFormat"%>
<%
Properties props = new Properties();
props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);
try {
PersonDAO persondao = (PersonDAO) ctx.lookup("PersonDAOBean/remote");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
persondao.insertPerson("小数", true, (short)22,formatter.parse("1985-10-17"));//添加一个人
out.println(persondao.getPersonNameByID(1)); //取personid为1的人
} catch (Exception e) {
out.println(e.getMessage());
}
%>
上面代码往数据库添加一个人,然后取personid 为1 的人员姓名。 

posted @ 2009-02-18 17:51  岁月无声  阅读(779)  评论(0编辑  收藏  举报