EJB3 学习Notes 1。

EJB3 学习Notes 1。

[Notes 1]   Get Started --- setup environment and Helloworld Example
   
       1.  建立开发环境,安装JDK5.0 Up,设置JAVA_HOME
              下载EJB3 Container,本文采用Sun的GlassFish V2,glassfish-installer-v2ur1-b09d-windows.jar,
              java -Xmx256m -jar glassfish-installer-v2ur1-b09d-windows.jar
              cd glassfish
              lib\ant\bin\ant -f setup.xml
        
       2.  启动GlassFish,把glassfish_home\bin 加到Path, 执行Command,asadmin start-domain domain1 或者
asadmin start-domain 将会启动默认
            的domain
. 用 asadmin stop-domain domain1来shutdown GlassFish.
           关于admin command 可以参考
http://docs.sun.com/app/docs/doc/819-3675/6n5slue6r?a=expand
       3.  建立测试环境,添加以下的Jars到ClassPath,
            GlassFish\lib\admin-cli.jar
            GlassFish\lib\ appserv-rt.jar
            GlassFish\lib\ appserv-ext.jar
            GlassFish\lib\ javaee.jar

            创建jndi.properties,放在src目录下,     

                     java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
          java.naming.factory.url.pkgs
=com.sun.enterprise.naming
          java.naming.factory.state
=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
          org.omg.CORBA.ORBInitialHost
=localhost
          org.omg.CORBA.ORBInitialPort
=3700

          创建sun-ejb-jar.xml,放在META-INF目录下,

       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com
       /software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
       <sun-ejb-jar>
        <enterprise-beans>
        </enterprise-beans>
       </sun-ejb-jar>
       创建数据库表:
       
  CREATE   TABLE  "PEOPLE" 

   (  "ID" 
NUMBER ( 9 , 0 NOT   NULL  ENABLE, 

         "NATION" 
VARCHAR2 ( 20  BYTE)  NOT   NULL  ENABLE, 

         "CITY" 
VARCHAR2 ( 50  BYTE), 

         "PHONE_NUMBER" 
VARCHAR2 ( 50  BYTE), 

         "ZIP_CODE" 
VARCHAR2 ( 20  BYTE), 

         "NAME" 
VARCHAR2 ( 200  BYTE)  NOT   NULL  ENABLE, 

          
CONSTRAINT  "PEOPLE_PK"  PRIMARY   KEY  ("ID")

  USING 
INDEX  PCTFREE  10  INITRANS  2  MAXTRANS  255  

  STORAGE(INITIAL 
65536   NEXT   1048576  MINEXTENTS  1  MAXEXTENTS  2147483645

  PCTINCREASE 
0  FREELISTS  1  FREELIST GROUPS  1  BUFFER_POOL  DEFAULT )

  TABLESPACE "DEMO"  ENABLE

   ) PCTFREE 
10  PCTUSED  40  INITRANS  1  MAXTRANS  255  NOCOMPRESS LOGGING

  STORAGE(INITIAL 
65536   NEXT   1048576  MINEXTENTS  1  MAXEXTENTS  2147483645

  PCTINCREASE 
0  FREELISTS  1  FREELIST GROUPS  1  BUFFER_POOL  DEFAULT )

  TABLESPACE "DEMO" ;
       配置数据库 DataSource 以及JNDI
    4.  开始EJB3的第1个helloworld,
          
(1).创建1个Entity
package ejb3.example.entity;
import
 java.io.Serializable;

import  javax.persistence.Basic;
import  javax.persistence.Column;
import  javax.persistence.Entity;
import  javax.persistence.GeneratedValue;
import  javax.persistence.GenerationType;
import  javax.persistence.Id;
import  javax.persistence.NamedQuery;
import  javax.persistence.SequenceGenerator;
import  javax.persistence.Table;

@Entity
@Table(name
= " PEOPLE " )
@NamedQuery(name 
=   " People.findAll " , query  =   " SELECT p FROM People p " )
@SequenceGenerator(name 
=   " PeopleSequence " ,sequenceName = " SEQ_PEOPLE " ,initialValue = 1 ,allocationSize = 1 )
public   class  People  implements  Serializable{
    @Id
    @Column(name
= " ID " ,nullable = false )
    @GeneratedValue(strategy 
=  GenerationType.SEQUENCE,generator = " PeopleSequence " )
    
private   int  id;
    
    @Column(name
= " NATION " ,nullable = false )
    
private  String nation;
    
    @Basic
    
private  String city;
    
    @Column(name
= " PHONE_NUMBER " )
    
private  String phoneNumber;
    
    @Column(name
= " ZIP_CODE " )
    
private  String zipCode;
    
    @Column(name
= " NAME " ,nullable = false )
    
private  String name;
    
    
    
public   int  getId() {
        
return  id;
    }
    
public   void  setId( int  id) {
        
this .id  =  id;
    }
    
public  String getNation() {
        
return  nation;
    }
    
public   void  setNation(String nation) {
        
this .nation  =  nation;
    }
    
public  String getCity() {
        
return  city;
    }
    
public   void  setCity(String city) {
        
this .city  =  city;
    }
    
public  String getPhoneNumber() {
        
return  phoneNumber;
    }
    
public   void  setPhoneNumber(String phoneNumber) {
        
this .phoneNumber  =  phoneNumber;
    }
    
public  String getZipCode() {
        
return  zipCode;
    }
    
public   void  setZipCode(String zipCode) {
        
this .zipCode  =  zipCode;
    }
    
public  String getName() {
        
return  name;
    }
    
public   void  setName(String name) {
        
this .name  =  name;
    }
    
    
    
public  String toString(){
        
return   new  StringBuilder()
        .append(
" id= " + id + " \n " )
        .append(
" name= " + name + " \n " )
        .append(
" nation= " + nation + " \n " )
        .append(
" city= " + city + " \n " )
        .append(
" zipCode= " + zipCode + " \n " )
        .append(
" phoneNumber= " + phoneNumber).toString();
    }
}
         创建persistence.xml放在META-INF目录下,定义Persistence Unit提供给EntityManager使用
<? 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 ="PeoplePersistenceUnit"  transaction-type ="JTA" >
        
< provider >
            oracle.toplink.essentials.PersistenceProvider
        
</ provider >
        
< jta-data-source > oracleDataSourceJNDI </ jta-data-source >
        
<!-- mapping-file>ejb3/example/entity/orm.xml</mapping-file -->
        
< class > ejb3.example.entity.People </ class >
        
< properties >
            
< property  name ="toplink.target-server"  value ="SunAS9" />
            
< property  name ="toplink.target-database"  value ="Oracle" />
            
< property  name ="toplink.logging.level"  value ="FINE" />
            
<!-- <property name="toplink.ddl-generation" value="drop-and-create-tables"/>
            
-->
        
</ properties >
    
</ persistence-unit >

</ persistence >
         
        
(2) 创建IPeoplePersistenceService来做Persistence Facade,使用EntityManager的API
         

package ejb3.example.service.api;

import  java.util.List;

import  javax.ejb.Local;

import ejb3. example .entity.People;


public   interface  IPeoplePersistenceService {
       
    
public   void  save(People p);
    
    
public  People find( int  id);
    
    
public  List < People > findAll();
    
    
public   void  update(People p);
    
    
public   void  delete( int  id);
    
    
public  List < People > query(String query);
    
    
public  List < People >  queryByPagination(String query, int  startPage, int  pageSize);
}
 
         (3). 实现Persistent Service
        


package  ejb3.example.service.impl;

import  java.util.List;

import  javax.ejb.Stateless;
import  javax.persistence.EntityManager;
import  javax.persistence.PersistenceContext;
import  javax.persistence.Query;

import  ejb3.example.entity.People;

@Stateless
public   class  PeoplePersistenceServiceBean  implements  IPeoplePersistenceService {
    @PersistenceContext(unitName
= " PeoplePersistenceUnit " )
    
private  EntityManager entityManager;
    
    
private   static   final   int  DEFAULT_PAGE_SIZE = 20 ;
    
public  List < People > query(String query){
        
return  entityManager.createQuery(query).getResultList();
    }
    
    
public  List < People > findAll(){
        
return  entityManager.createNamedQuery( " People.findAll " ).getResultList();
    }
    
    
public   void  save(People p) {
        assertNotNull(p);
        entityManager.persist(p);
    }
    
    
public  People find( int  id){
        
return  entityManager.find(People. class , id);
    }

    
public   void  delete( int  id) {
        People p
= entityManager.find(People. class , id);
        
if (p != null )
         entityManager.remove(p);
    }

    
public   void  update(People p) {
        assertNotNull(p);
        entityManager.merge(p);
    }
    
    
    
public  List < People >  queryByPagination(String query, int  startPage, int  pageSize){
        Query q
= entityManager.createQuery(query);
        q.setMaxResults(pageSize
< 1 ? DEFAULT_PAGE_SIZE:pageSize);
        
if (startPage < 1 )startPage = 1 ;
        q.setFirstResult(startPage
* pageSize);
        
return  q.getResultList();
    }
    
    
    
private   void  assertNotNull(Object o){
         
if ( null ==o)
             
throw   new  RuntimeException( " Object cannot be null " );
    }
     
}

        (4). 创建Business Logic的Service Interface

package  ejb3.example.service.api;

import  java.util.List;

import  javax.ejb.Local;
import  javax.ejb.Remote;

import  ejb3.example.entity.People;



public   interface  IPeopleManager {
      
      
public  People findById( int  id);
      
      
public  List < People >  findByName(String name);
      
      
public  List < People >  findByNation(String nation);
      
      
public  List < People >  findAll();
      
      
public   void  update(People p);
      
      
public   void  deleteById( int  id);
      
      
public   void  save(People p);
      
      
public  List < People >  queryByPagination(String query, int  startPage, int  pageSize);
    
}
      
      (5).创建 Stateless Bean来处理 Busniess Logic , 它实现 IPeopleManager


package  ejb3.example.service.impl;

import  java.util.List;

import  javax.annotation.Resource;
import  javax.ejb.EJB;
import  javax.ejb.Remote;
import  javax.ejb.Stateless;
import  javax.jms.Connection;
import  javax.jms.ConnectionFactory;
import  javax.jms.Destination;
import  javax.jms.JMSException;
import  javax.jms.MessageProducer;
import  javax.jms.ObjectMessage;
import  javax.jms.Session;

import  ejb3.example.entity.People;


@
Local (IPeopleManager. class )
@Stateless(name
= " peopleManagerBean " , mappedName = " peopleManagerBeanJNDI "
public   class  PeopleManagerBean  implements  IPeopleManager {

    
private   static   final  String PEOPLE_ENTITY = People. class .getSimpleName();

    @EJB IPeoplePersistenceService persister;

    
    
public   void  deleteById( int  id) {
        persister.delete(id);

    }

    
public  List < People >  findAll() {
        
return  persister.findAll();
    }

    
public  People findById( int  id) {
        
return  persister.find(id);
    }

    
public  List < People >  findByName(String name) {
        
return   persister.query( " select p from  " + PEOPLE_ENTITY + "  p where p.name=: " + name);
    }

    
public  List < People >  findByNation(String nation) {
        
return   persister.query( " select p from  " + PEOPLE_ENTITY + "  p where p.nation=: " + nation);
    }

    
public  List < People >  queryByPagination(String query, int  startPage,  int  pageSize) {
        
return   persister.queryByPagination(query, startPage, pageSize);

    }

    
public   void  save(People p) {
        persister.save(p);
    }

    
public   void  update(People p) {
        persister.update(p);
    }
     
}

       (6). Export Jar,把它放在glassfish\domains\domain1\autodeploy,这个会再GlassFish启动的时候自动部署或者打开http://localhost:4848,用默认的帐号登陆来Deploy
             (user: admin   password: adminadmin)
            

        (7). 创建测试客户端
 

package  ejb3.example.client;

import  java.sql.SQLException;
import  java.util.Iterator;

import  javax.naming.Context;
import  javax.naming.InitialContext;
import  javax.naming.NamingException;

import  ejb3.example.service.api.IPeopleManager;
import  ejb3.example.entity.People;


public   class  TestClient {

    
/**
     * Method documentation to be filled
     * TODO
     *
     * 
@param  args
     * 
@throws  NamingException 
     * 
@throws  SQLException 
     * 
@throws  ClassNotFoundException 
     * 
@throws  IllegalAccessException 
     * 
@throws  InstantiationException 
     
*/
    
public   static   void  main(String[] args)  throws  NamingException, SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {

        Context context 
=   new  InitialContext ();
        IPeopleManager mgr 
=  (IPeopleManager)context.lookup ( " peopleManagerBeanJNDI " );
        People p
= mgr.findById( 1 );
        p.setCity(
" beijing Chaoyang " );
        p.setName(
"gembin " );
        p.setNation(
" Great China " );
        p.setPhoneNumber(
" xxxx " );
        p.setZipCode(
" 100000 " );
        mgr.update(p);
        Iterator
< People > ps = mgr.findAll().iterator();
        
while (ps.hasNext()){
            System.out.println(
" ********************* " );
            System.out.println(ps.next());
            System.out.println(
" ********************* " );
        }
     
    }
}


       

你可能感兴趣的:(EJB3 学习Notes 1。)