paulwong

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,0NOT 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(
"*********************");
        }

     
    }

}


posted on 2009-02-26 09:44 paulwong 阅读(380) 评论(0)  编辑  收藏 所属分类: J2EE


只有注册用户登录后才能发表评论。


网站导航: