[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("*********************");
        }
     
    }
}