JBOSS+EJB3+MYSQL开发

参考文献:

myeclipse+jboss开发EJB3.0之实体Bean

MyEclipse+JBoss开发EJB3.0

ejb3.0中persistence.xml文件

EJB项目中Persistence.xml配置

 

一. 配置

       Jboss有一个默认的数据源DefaultDS,他使用Jboss内置的HSQLDB数据库。实际应用中你可能使用不同的数据库,如MySql、MsSqlServer、Oracle等。各种数据库的数据源配置模版你可以在[Jboss_home]\docs\examples\jca 目录中找到,默认名称为:数据库名+ -ds.xml 。不管你使用那种数据库都需要把他的驱动类Jar 包放置在[Jboss_home]\server\all\lib 目录下,放置后需要启动Jboss服务器。前一篇博客有提到相关内容: JBoss中配置数据源出现错误:“Failed to register driver for: com.mysql.jdbc.Driver”的解决方法  
        下面介绍Mysql的数据源配置,数据源配置文件的取名格式必须为 xxx–ds.xml ,如:mysql-ds.xml ,mssqlserver-ds.xml,oracle-ds.xml 。 数据源文件配置好后需要放置在[jboss_home]/server/config-name/deploy目录下,我现在采用的配置名为:default,所以路径为[jboss_home]/server/default/deploy目录下面定义一个名为MySqlDS的Mysql数据源,连接数据库为ejb,数据库登录用户名为root,密码为root,数据库驱动类为com.mysql.jdbc.Driver。大家只需修改数据库名及登录用户名密码就可以直接使用。
mysql-ds.xml

 

 

<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: mysql-ds.xml 41017 2006-02-07 14:26:14Z acoliver $ --> <!-- 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/ejb?useUnicode=true&characterEncoding=UTF-8</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>root</password> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> <!-- should only be used on drivers after 3.22.1 with "ping" support <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-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 - MySQLValidConnectionChecker is preferred for newer drivers <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>

二. 开发实体bean

开发前先介绍需要映射的数据库表:person

 

注意:在这里并没有在数据库中建表,表是在发布ejb这个jar包的时候创建的。
Person.java

 

package edu.sjtu.erp.ejbstudy.bean; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @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 edu.sjtu.erp.ejbstudy.dao; 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的实现 

 

 

package edu.sjtu.erp.ejbstudy.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 edu.sjtu.erp.ejbstudy.bean.Person; import edu.sjtu.erp.ejbstudy.dao.PersonDAO; @Stateless @Remote(PersonDAO.class) public class PersonDAOBean implements PersonDAO { @PersistenceContext protected EntityManager em; @Override public boolean insertPerson(String name, boolean sex, Short age, Date birthday) { try{ Person person=new Person(); person.setName(name); person.setSex(sex); person.setAge(age); person.setBirthday(birthday); em.persist(person); }catch(Exception e){ e.printStackTrace(); return false; } // TODO Auto-generated method stub return true; } @Override public String getPersonNameById(int personid) { // TODO Auto-generated method stub Person person=em.find(Person.class, Integer.valueOf(personid)); return person.getName(); } 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="ejb") EntityManager em; 如果只有一个持久化内容配置,不需要明确指定。 

 

下面是persistence.xml文件的配置:

<?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns="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-unit name="ejb"> <jta-data-source>java:/MySqlDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> </persistence>

三.打包项目并发布

 

1. 配置数据源文件mysql-ds.xml并放置在[jboss_home]/server/deploy/deploy 目录,把数据库驱动Jar 包mysql-connector-java-bin.jar放置在[Jboss_home]\server\default\lib 目录下,放置后需要重启Jboss服务器。如果数据源已经存在就不需要配置。
2. 配置persistence.xml文件,在文件中指定使用的源据源及各项参数。
3. 把实体类和persistence.xml文件打成Jar,persistence.xml 放在jar 文件的META-INF目录
打包方法:在eclipse中右键项目EJBStudy->export->java->jar file,然后选择要打包的内容,如下图所示:

将生成的EJBStudy.jar放到目录jboss-5.0.1.GA\server\default\deploy下。这个时候eclipse的console中会提示信息:

 

13:51:33,390 INFO [Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@1458635375{vfszip:/D:/Program%20Files%20(x86)/JavaEE/jboss-5.0.1.GA/server/default/deploy/EJBStudy.jar/} 13:51:33,391 INFO [Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@1458635375{vfszip:/D:/Program%20Files%20(x86)/JavaEE/jboss-5.0.1.GA/server/default/deploy/EJBStudy.jar/} 13:51:33,417 INFO [JBossASKernel] Created KernelDeployment for: EJBStudy.jar 13:51:33,417 INFO [JBossASKernel] installing bean: jboss.j2ee:jar=EJBStudy.jar,name=PersonDAOBean,service=EJB3 13:51:33,417 INFO [JBossASKernel] with dependencies: 13:51:33,417 INFO [JBossASKernel] and demands: 13:51:33,417 INFO [JBossASKernel] jboss.ejb:service=EJBTimerService 13:51:33,417 INFO [JBossASKernel] persistence.unit:unitName=#ejb 13:51:33,417 INFO [JBossASKernel] and supplies: 13:51:33,418 INFO [JBossASKernel] jndi:PersonDAOBean/remote-edu.sjtu.erp.ejbstudy.dao.PersonDAO 13:51:33,418 INFO [JBossASKernel] Class:edu.sjtu.erp.ejbstudy.dao.PersonDAO 13:51:33,418 INFO [JBossASKernel] jndi:PersonDAOBean/remote 13:51:33,418 INFO [JBossASKernel] Added bean(jboss.j2ee:jar=EJBStudy.jar,name=PersonDAOBean,service=EJB3) to KernelDeployment of: EJBStudy.jar 13:51:33,426 INFO [PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=#ejb 13:51:33,428 WARN [Ejb3Configuration] Persistence provider caller does not implement the EJB3 spec correctly. PersistenceUnitInfo.getNewTempClassLoader() is null. 13:51:33,429 INFO [AnnotationBinder] Binding entity from annotated class: edu.sjtu.erp.ejbstudy.bean.Person 13:51:33,429 INFO [EntityBinder] Bind entity edu.sjtu.erp.ejbstudy.bean.Person on table Person 13:51:33,437 INFO [HibernateSearchEventListenerRegister] Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. 13:51:33,438 INFO [ConnectionProviderFactory] Initializing connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider 13:51:33,438 INFO [InjectedDataSourceConnectionProvider] Using provided datasource 13:51:33,438 INFO [SettingsFactory] RDBMS: MySQL, version: 5.5.16 13:51:33,438 INFO [SettingsFactory] JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.18 ( Revision: tonci.grgin@oracle.com-20110930151701-jfj14ddfq48ifkfq ) 13:51:33,439 INFO [Dialect] Using dialect: org.hibernate.dialect.MySQLDialect 13:51:33,439 INFO [TransactionFactoryFactory] Transaction strategy: org.hibernate.ejb.transaction.JoinableCMTTransactionFactory 13:51:33,439 INFO [TransactionManagerLookupFactory] instantiating TransactionManagerLookup: org.hibernate.transaction.JBossTransactionManagerLookup 13:51:33,439 INFO [TransactionManagerLookupFactory] instantiated TransactionManagerLookup 13:51:33,439 INFO [SettingsFactory] Automatic flush during beforeCompletion(): disabled 13:51:33,439 INFO [SettingsFactory] Automatic session close at end of transaction: disabled 13:51:33,439 INFO [SettingsFactory] JDBC batch size: 15 13:51:33,439 INFO [SettingsFactory] JDBC batch updates for versioned data: disabled 13:51:33,439 INFO [SettingsFactory] Scrollable result sets: enabled 13:51:33,439 INFO [SettingsFactory] JDBC3 getGeneratedKeys(): enabled 13:51:33,439 INFO [SettingsFactory] Connection release mode: auto 13:51:33,439 INFO [SettingsFactory] Maximum outer join fetch depth: 2 13:51:33,439 INFO [SettingsFactory] Default batch fetch size: 1 13:51:33,439 INFO [SettingsFactory] Generate SQL with comments: disabled 13:51:33,439 INFO [SettingsFactory] Order SQL updates by primary key: disabled 13:51:33,440 INFO [SettingsFactory] Order SQL inserts for batching: disabled 13:51:33,440 INFO [SettingsFactory] Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory 13:51:33,440 INFO [ASTQueryTranslatorFactory] Using ASTQueryTranslatorFactory 13:51:33,440 INFO [SettingsFactory] Query language substitutions: {} 13:51:33,440 INFO [SettingsFactory] JPA-QL strict compliance: enabled 13:51:33,440 INFO [SettingsFactory] Second-level cache: enabled 13:51:33,440 INFO [SettingsFactory] Query cache: disabled 13:51:33,440 INFO [SettingsFactory] Cache region factory : org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge 13:51:33,440 INFO [RegionFactoryCacheProviderBridge] Cache provider: org.hibernate.cache.HashtableCacheProvider 13:51:33,440 INFO [SettingsFactory] Optimize cache for minimal puts: disabled 13:51:33,440 INFO [SettingsFactory] Cache region prefix: persistence.unit:unitName=#ejb 13:51:33,440 INFO [SettingsFactory] Structured second-level cache entries: disabled 13:51:33,440 INFO [SettingsFactory] Echoing all SQL to stdout 13:51:33,440 INFO [SettingsFactory] Statistics: disabled 13:51:33,440 INFO [SettingsFactory] Deleted entity synthetic identifier rollback: disabled 13:51:33,440 INFO [SettingsFactory] Default entity-mode: pojo 13:51:33,440 INFO [SettingsFactory] Named query checking : enabled 13:51:33,443 INFO [SessionFactoryImpl] building session factory 13:51:33,447 INFO [SessionFactoryObjectFactory] Factory name: persistence.unit:unitName=#ejb 13:51:33,447 INFO [NamingHelper] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces} 13:51:33,457 INFO [SessionFactoryObjectFactory] Bound factory to JNDI name: persistence.unit:unitName=#ejb 13:51:33,457 WARN [SessionFactoryObjectFactory] InitialContext did not implement EventContext 13:51:33,459 INFO [SchemaExport] Running hbm2ddl schema export 13:51:33,459 INFO [SchemaExport] exporting generated schema to database 13:51:33,532 INFO [SchemaExport] schema export complete 13:51:33,534 INFO [NamingHelper] JNDI InitialContext properties:{java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory, java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces} 13:51:33,550 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EJBStudy.jar,name=PersonDAOBean,service=EJB3 13:51:33,551 INFO [EJBContainer] STARTED EJB: edu.sjtu.erp.ejbstudy.impl.PersonDAOBean ejbName: PersonDAOBean 13:51:33,558 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: PersonDAOBean/remote - EJB3.x Default Remote Business Interface PersonDAOBean/remote-edu.sjtu.erp.ejbstudy.dao.PersonDAO - EJB3.x Remote Business Interface 我们在mysql数据库中也会看到ejb数据中创建了一张person表。

四.测试

创建一个EJB客户端来测试,代码如下

package edu.sjtu.erplab.ejb.test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Properties; import javax.naming.InitialContext; import javax.naming.NamingException; import edu.sjtu.erp.ejbstudy.dao.PersonDAO; public class EJBClient { /** * @param args * @throws ParseException */ public static void main(String[] args) throws ParseException { // TODO Auto-generated method stub Properties props=new Properties(); //坑爹的写成:org.jnp.interface.NamingContextFactory 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"); try { InitialContext ctx=new InitialContext(props); //InitialContext ctx=new InitialContext(); PersonDAO persondao = (PersonDAO) ctx.lookup("PersonDAOBean/remote"); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); persondao.insertPerson("xuwei", true, (short)22,formatter.parse("1985-10-17"));//添加一个人 System.out.println(persondao.getPersonNameById(1)); //取personid为1的人 }catch(NamingException e){ System.out.println(e.getMessage()); } } } 不明白为什么会有如下这么多警告,不过数据已经正确插入表person中

13:54:55,200 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 13:54:55,200 WARN [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container 13:54:55,200 WARN [InterceptorRegistry] applicable interceptors is non-existent for public edu.sjtu.erp.ejbstudy.bean.Person edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.getPersonByID(int) 13:54:55,203 WARN [InterceptorRegistry] applicable interceptors is non-existent for public boolean edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.insertPerson(java.lang.String,boolean,java.lang.Short,java.util.Date) 13:54:55,205 WARN [InterceptorRegistry] applicable interceptors is non-existent for public boolean edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.updatePerson(edu.sjtu.erp.ejbstudy.bean.Person) 13:54:55,208 WARN [InterceptorRegistry] applicable interceptors is non-existent for public java.lang.String edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.getPersonNameById(int) 13:54:55,210 WARN [InterceptorRegistry] applicable interceptors is non-existent for public java.util.List edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.getPersonList() 13:54:55,213 WARN [InterceptorRegistry] applicable interceptors is non-existent for public edu.sjtu.erp.ejbstudy.bean.Person edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.getPersonByID(int) 13:54:55,216 WARN [InterceptorRegistry] applicable interceptors is non-existent for public boolean edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.insertPerson(java.lang.String,boolean,java.lang.Short,java.util.Date) 13:54:55,218 WARN [InterceptorRegistry] applicable interceptors is non-existent for public boolean edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.updatePerson(edu.sjtu.erp.ejbstudy.bean.Person) 13:54:55,221 WARN [InterceptorRegistry] applicable interceptors is non-existent for public java.lang.String edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.getPersonNameById(int) 13:54:55,223 WARN [InterceptorRegistry] applicable interceptors is non-existent for public java.util.List edu.sjtu.erp.ejbstudy.impl.PersonDAOBean.getPersonList() 13:54:55,227 INFO [STDOUT] Hibernate: insert into Person (age, birthday, name, sex) values (?, ?, ?, ?) 13:54:55,301 INFO [STDOUT] Hibernate: select person0_.personid as personid72_0_, person0_.age as age72_0_, person0_.birthday as birthday72_0_, person0_.name as name72_0_, person0_.sex as sex72_0_ from Person person0_ where person0_.personid=?



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值