q个接口很简单,和无状态会话Bean基本相同Q但新增加了一个CleanҎQƈ为此Ҏ加上Remove注释。一旦此Ҏ被执行完毕,此Bean被从容器中删除?
JBOSS默认使用接口的全UC为它的JNDI名。在上面的例子中Q它的全U就是:com.kuaff.ejb3.stateful.CounterQ你也可以通过Counter.class得到?
CounterBean.java
q个是计数器的实现类。注意这个类使用Stateful做了注释Q这是必ȝ。同Ӟq个例子也演CZ如何使用事务。事务的详细用法在后面的章节中介绍?nbsp;
Client.java
q个cȝ来测试我们发布的计数器EJB。首先通过
ctx = new InitialContext();得到上下文,然后通过lookup查找计数器,然后l计数器?0Q显C当前的计数器信息。最后调用CleanҎQ一旦这个方法执行完毕,此EJB从容器中删除,在用这个EJB会出现异常?
误行{$JBOSS_HOME}/bin目录下的run.bat: run ?call,启动JBOSS?
?a target="_blank">Eclipse的Ant视图中执行ejbjar target。或者在命o行下Q进入到此工E目录下Q执行ant ejbjar,编译打包发布此EJB?
在Eclipse的Ant视图中执行run target。或者在命o行下Q进入到此工E目录下Q执行ant run,试q个EJB?/p>
在分布式开发中QJAVA客户端程序是通过JNDIL询EJB的,而JNDI的全名是QThe Java Naming and Directory Interface。因为JNDI 是一l接口,所以我们只需Ҏ接口规范~程可以。要通过JNDI q行资源讉KQ我们必设|初始化上下文的参数Q主要是讄JNDI 驱动的类?java.naming.factory.initial)和提供命名服务的URL
(java.naming.provider.url)。因为Jndi 的实C品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务?br />
的不同而不同,java.naming.provider.url 的值包括提供命名服务的L地址和端口号?/p>
大家在编E时Q最令h气愤的就是EJBE序写好了,而客L却不知道如何去调用它Q一般书上只是介l一U应用服务器的访问代码其它的不会提到Q找q方面资料又比较ȝQ当误大家许多时间和_֊Q因此我把已经扑ֈ的代码脓出来Q方便大家查找?/p>
暂且提供以下三种服务器的代码Q今后再慢慢补充吧?/p>
下面是访问Jboss 服务器的
例子代码Q?br />
下面是访问Sun ApplicationServer 及glassfish 应用服务器的例子代码Q?br />
下面是访问Weblogic10 应用服务器的例子代码Q?br />
上面是服务器默认的JNDI命名规则,那么如何修改它呢.
在Jboss 中要自定义JNDI 名称Q可以
用@LocalBinding 和@RemoteBinding 注释Q@LocalBinding 注释指定Session Bean 的Local 接口的JNDI 名称Q?br />
@RemoteBinding 注释指定Session Bean 的Remote 接口的JNDI 名称Q下面的代码展示了如何自定义JNDI 名:
在JSP 客户端调用上面EJB 的代码片断如下:
客户端调用EJB 的代码片断如下:
![]() ?.CZ域对象模? |
package onjava; import java.io.Serializable; import java.util.Collection; import javax.persistence.*; @Entity @NamedQuery(name="findAllDepartment", query="select o from Department o") @Table(name="DEPT") public class Department implements Serializable { @Id @Column(nullable=false) protected Long deptNo; @Column(name="DNAME") protected String name; @Column(name="LOC") protected String location; @OneToMany(mappedBy="department") protected Collection employees; public Department() { } ... public Collection getEmployees() { return employees; } public void setEmployees(Collection employees) { this.employees = employees; } public Employee addEmployee(Employee employee) { getEmployees().add(employee); employee.setDepartment(this); return employee; } public Employee removeEmployee(Employee employee) { getEmployees().remove(employee); employee.setDepartment(null); return employee; } } |
@Id public Long getDeptNo() { return deptNo; } public void setDeptNo(Long deptNo) { this.deptNo = deptNo; } |
@Embeddable public class Address { protected String streetAddr1; protected String streetAddr2; protected String city; protected String state; .. } |
@Entity public class Employee { @Id @GeneratedValue(strategy=GenerationType.AUTO) protected Long id; ... @Embedded protected Address address; ... } |
@OneToMany(mappedBy="department") protected CollectionQEmployeeQ?employees ; |
@Table(name="DEPT") public class Department implements Serializable { |
@Column(name="DNAME") protected String name; |
@Entity @Table(name="EMP") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="EMPLOYEE_TYPE", discriminatorType=DiscriminatorType.STRING, length=1) public abstract class Employee implements Serializable { ... } |
@Entity @DiscriminatorValue(value="F") public class FullTime extends Employee { @Column(name="SAL") protected Double salary; @Column(name="COMM") protected Double commission; @Column(name="DESIG") protected String designation; ... } |
@PersistenceContext(unitName="onjava") private EntityManager em; |
@PersistenceUnit(unitName="onjava") private EntityManagerFactory emf; private EntityManager em = emf.createEntityManager(); |
Ҏ | 用?/td> |
public void persist(Object entity); | 持久化实体实例?/td> |
public QTQ?T merge(T entity); | 合ƈ分离的实体实例?/td> |
public void remove(Object entity); | U除实体实例?/td> |
public QTQ?T find(ClassQTQ?entityClass, Object primaryKey); | 通过主键索实体实例?/td> |
public void flush(); | 使实体状态与数据库同步? |
@PersistenceContext(unitName="onjava") private EntityManager em; ... Contractor pte = new Contractor(); pte.setName("Nistha") pte.setHourlyRate(new Double(100.0)); em.persist(pte); |
Query query = em.createQuery( "select e from Employee e where e.empNo Q?1"); query.setParameter(1,100); return query.getResultList(); |
@Entity @NamedQuery(name="findAllEmployee", query="select e from Employee e where e.empNo Q?1") public abstract class Employee implements Serializable { } |
query = em.createNamedQuery(" findAllEmployee"); query.setParameter(1,100); return query.getResultList(); |
query = em.createNamedQuery("findAllEmployee"); query.setParameter("empNo",100); return query.getResultList(); |
QpersistenceQ? Qpersistence-unit name="onjava"Q? QproviderQoracle.toplink.essentials.PersistenceProviderQ?providerQ?br /> Qjta-data-sourceQjdbc/OracleDSQ?jta-data-sourceQ? ... Q?persistence-unitQ? Q?persistenceQ?/td> |