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