EJB3 session bean(会话bean)

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>

 

此注释用来实例化JPAEntityManager

@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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值