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。)