天天看點

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>
           

此注釋用來執行個體化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