Session Bean接口定义@Local,@Remote
Interface xxxDAO{}
@Local
Interface LocalxxxDAO extends xxxDAO{}
@Remote
Interface RemotexxxDAO extends xxxDAO{}
@Local 注释定义本地接口(使用范围,客户端和EJB在同一容器(wls,jboss)中 使用本地接口可以提高访问的效率 如果不在同一容器中 只能通过远程调用
@Remote 注释定义远程接口 供远程客户调用 (RMI协议)
SessionBean定义@Stateless,@Statefull
无状态会话bean @Stateless
有状态会话bean @Stateful
无状态会话bean
@Stateless
class XDAOImpl implements LocalxxxDAO, RemotexxxDAO
无状态会话bean 的不记录客户的状态就是无状态,并不是EJB部署的时候产生一个单例的实例,jboss对无状态会话bean是有CLASSPOOL的 默认最多30个实例 后面介绍配置池的大小,Stateless bean是在客户端请求的时候进行实例化或是等待实例池的对象
@Stateful
class XDAOImpl implements LocalxxxDAO, RemotexxxDAO
配置会话bean类型的时候如果不指定JNDI名字则默认为 当前类名+”/(remote|local)"
上面代码中的JNDI名字为 XDAOImpl/remote XDAOImpl/local
有状态会话bean 是客户端请求的时候生成新的实例,完成操作以后再进行垃圾回收 对系统的性能有很大影响,所以在开发的时候如果不是特别需要不会创建stateful bean。
Stateless,Stateful注释的源代码: package javax.ejb; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({java.lang.annotation.ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Stateful Stateless { public abstract String name(); public abstract String mappedName(); public abstract String description(); }
如果我们使用注释@Stateless(name=”com/rich/biz/xxx”)
此时的JNDI的名字就是“com/rich/biz/xxx/remote”和“com/rich/biz/xxx/local”
配置实例池 @PoolClass 是jboss提供的(只能用于jboss服务器:))
这个用在配置无状态会话bean的时候使用(有状态会话bean也可以配置此信息但是实例达到max值以后就不能调用此session bean了)
先看源代码:
package org.jboss.annotation.ejb; import java.lang.annotation.Annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.jboss.ejb3.Pool; @Retention(RetentionPolicy.RUNTIME) @Target({java.lang.annotation.ElementType.TYPE}) public @interface PoolClass { public abstract Class<? extends Pool> value(); public abstract int maxSize(); public abstract long timeout(); }
实现:
import java.lang.annotation.Annotation; public class PoolClassImpl implements PoolClass { public Class value; public int maxSize = 30; public long timeout = 9223372036854775807L; public Class value() { return this.value; } public void setValue(Class value) { this.value = value; } public int maxSize() { return this.maxSize; } public void setMaxSize(int maxSize) { this.maxSize = maxSize; } public long timeout() { return this.timeout; } public void setTimeout(long timeout) { this.timeout = timeout; } public Class<? extends Annotation> annotationType() { return PoolClass.class; } public String toString() { StringBuffer sb = new StringBuffer(100); sb.append("[PoolClassImpl:"); sb.append("value=").append(this.value); sb.append(", maxSize=").append(this.maxSize); sb.append(", timeout=").append(this.timeout); sb.append("]"); return sb.toString(); } }
public int maxSize = 30;默认大小事30
public long timeout = 9223372036854775807L;等待时间
使用方法:
@Stateless
@PoolClass(value=org.jboss.ejb3.StrictMaxPool.class,maxSize = 5,timeout=1000L)
class XDAOImpl implements LocalxxxDAO, RemotexxxDAO
如果我们定义的池的最大容量为5 等待时间仅为1秒 那么很容易抛出timeout的链接异常,随便写个例子 然后客户端跑个Thread去调用就可以看到效果
考虑到程序移植的问题 不是EJB3的注释建议放在配置文件里
持久化上下文@PersistenceContext(unitName="jboss") 管理数据库连接和事务
首先使用前定义一个persistence-unit, 位置 src/META-INF
名字:persistence.xml
内容如下:
<?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="jboss" transaction-type="JTA">
<jta-data-source>java:/MySqlDS</jta-data-source>
<!--
<properties>
</properties> -->
</persistence-unit>
</persistence>
此注释用来实例化JPA的EntityManager
@PersistenceContext(unitName="jboss")
private EntityManager entitymanager;
实体bean注释:@Entity,@Table,@Id,@Column,@GeneratedValue,@ManyToMany,@ManyToOne,@OneToMany,@OneToOne,@OrderBy
定义一个POJO
@Entity
@Table(name=”XXX”)
Class XXX implements java.io.Serializable
@Entity注释用来定义一个实体
@Table用来配置此实体对应的数据库中的表明,库名等信息
public interface Table
extends Annotation
{
public abstract String name();
public abstract String catalog();
public abstract String schema();
public abstract UniqueConstraint[] uniqueConstraints();
}
JPA的注释太多了 可以参看oracle的JPA文档库的介绍 很详细
http://www.oracle.com/technology/global/cn/products/ias/toplink/jpa/index.html