`
longgangbai
  • 浏览: 7254211 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

EJB3学习笔记之 EJB3中的注释(一)

阅读更多

1.  

<!-- [endif]-->

@EJB 注释

其常用属性如下:

       beanName: 指定 EJB 的类名(不带包名),

       mappedName: 指定 Bean 实例的 JNDI 名。

例如:

       A @EJB(beanName=” A”)

              IA  a;

       A 就是 IA 的实现类,如果 IA 的实现只有一个,那么这里可以不指定。

注意: 学习 EJB3.0 时,我用的是 JBoss-4.0.5.GA JBoss-4.0.5.GA 把以前版本 @EJB 注释从 javax.annotation 包移到了 javax.ejb 中了。

B 、依赖注入之 @Resource

@Resource 注释,注入来自 JNDI 的任何资源。

例如:

       @Resource (mappedName=”java:/DefaultMySqlDS”)

       DataSource myDb;

“java:/DefaultMySqlDS” 是数据源 DefaultMySqlDS 的全局 JNDI 名。如果 JNDI 对象在本地 (java:comp/env)JNDI 目录中,则只需给定它的映射名称即可。

 

<!-- [if !supportLists]-->2.   <!-- [endif]-->实体Bean

       一个实体 Bean 由实体类和 persistence.xml 文件组成。 Persistence.xml 文件在 Jar 文件的 META-INF 目录。 Persistence.xml 文件指定实体 Bean 使用的数据源及 EntityManager 对象的默认行为。 Persistence.xml 文件的配置说明如下:

<persistence>

<persistence-unit name="xxx">

<jta-data-source>java:/ MySqlDS</jta-data-source>

<properties>

<property name="hibernate.hbm2ddl.auto" value="create-drop"/>

</properties>

</persistence-unit>

</persistence>

       Persistence-unit 节点可以一有一个或多个,每个 persistence-unit 节点定义了持久化内容名称、使用的数据源名称及 Hibernate 属性。 Name 属性用作设置持久化名称。 jta-data-source 节点用作指定实体 Bean 使用的数据源名称,指定数据源名称时 java:/ 前缀不能缺少,数据源名称大小写敏感。

Properties 节点用过指定 Hibernate 的各项属性,如果 hibernate.hbm2ddl.auto 的值设为 create-drop ,在实体 Bean 发布及卸载时将自动创建及删除相应数据表。

       注意: 在编写 EJB 的实体 Bean 时一定要注意,必须有一个无参数的构造函数,当然如果你没写任何构造函数, java 会自动给你一个默认的无参数的构造函数。但是当你自己写了有参数的构造函数时,千万别忘记了加上一个无参数的构造函数,最好的习惯是在建类时就把无参数构造函数写上,这样就不会出错。

<!-- [if !supportLists]-->A.        <!-- [endif]-->写在类声明之前的有:

<!-- [if !supportLists]-->a.         <!-- [endif]-->@Entity ,以表明此 Bean EntityBean

<!-- [if !supportLists]-->b.         <!-- [endif]-->@Table(name=”TableName”) ,表示此实体 Bean 对应的数据库表名。

<!-- [if !supportLists]-->B.        <!-- [endif]-->写在 getXxx() 方法声明之前的有:

<!-- [if !supportLists]-->a.         <!-- [endif]-->@Column 注释定义了映射到列的所有属性,如:列名是否唯一,是否允许为空,是否允许更新等,它的属性介绍如下:

<!-- [if !supportLists]-->n   <!-- [endif]-->name: 映射的列名。如:映射 Person 表的 PersonName 列,可以在 name 属性的 getName 方法上面加入 @Column(name=”PersonName”) ,如果不指定映射列名,容器将属性名称作为默认的映射列名。

<!-- [if !supportLists]-->n   <!-- [endif]-->unique: 是否唯一

<!-- [if !supportLists]-->n   <!-- [endif]-->nullable: 是否允许为空

<!-- [if !supportLists]-->n   <!-- [endif]-->length: 对于字符型列, length 属性指定列的最大字符长度

<!-- [if !supportLists]-->n   <!-- [endif]-->insertable: 是否允许插入

<!-- [if !supportLists]-->n   <!-- [endif]-->updatable: 是否允许更新

<!-- [if !supportLists]-->n   <!-- [endif]-->columnDefinition: 定义建表时创建此列的 DDL

<!-- [if !supportLists]-->n   <!-- [endif]-->secondaryTable: 从表名。如果此列不建在主表上 ( 默认建在主表 ) ,该属性定义该列所在从表的名字。

<!-- [if !supportLists]-->b.         <!-- [endif]-->@Id 注释指定 personid 属性为表的主键,它可以有多种生成方式:

<!-- [if !supportLists]-->n   <!-- [endif]-->TABLE :容器指定用底层的数据表确保唯一。

<!-- [if !supportLists]-->n   <!-- [endif]-->SEQUENCE :使用数据库的 SEQUENCE 列来确保唯一

<!-- [if !supportLists]-->n   <!-- [endif]-->IDENTITY :使用数据库的 INDENTIT 列来保证唯一

<!-- [if !supportLists]-->n   <!-- [endif]-->AUTO :有容器挑选一个合适方式来保证唯一

<!-- [if !supportLists]-->n   <!-- [endif]-->NONE :容器不负责主键的生成,由调用程序来完成

<!-- [if !supportLists]-->c.         <!-- [endif]-->@GeneratedValue 注释定义标识字段的生成方式。

<!-- [if !supportLists]-->3.   <!-- [endif]-->复合主键(Composite Primary Key)

当需要使用多个属性变量(表中的多列)联合起来作为主键时,我们需要使用复合主键。复合主键要求我们编写一个复合主键类 ( Composite Primary Key Class ) 。复合主键类需要符合以下一些要求:

<!-- [if !supportLists]-->A.       <!-- [endif]-->复合主键类必须是 public ,必须具备一个没有参数的构造函数

<!-- [if !supportLists]-->B.        <!-- [endif]-->复合主键类的每个属性变量必须有 getter/setter ,如果没有,每个属性变量则必须是 public 或者 protected

<!-- [if !supportLists]-->C.       <!-- [endif]-->复合主键类必须实现 java.io.Serializable 接口

<!-- [if !supportLists]-->D.       <!-- [endif]-->复合主键类必须重写 equals() hashcode() 方法

<!-- [if !supportLists]-->E.        <!-- [endif]-->复合主键类中的主键属性变量的名字必须和对应的 EntityBean 中主键属性变量的名字相同

<!-- [if !supportLists]-->F.        <!-- [endif]-->一旦主键值设定后,不要修改主键属性变量的值

<!-- [if !supportLists]-->4.   <!-- [endif]-->JBoss 的目录结构

安装 JBoss 会创建下列目录结构:

目录                      描述

bin                        启动和关闭 JBoss 的脚本

client                     客户端与 JBoss 通信所需的 Java 库( JARs

docs                            配置的样本文件(数据库配置等)

docs/dtd                JBoss 中使用的各种 XML 文件的 DTD

lib                         一些 JAR JBoss 启动时加载,且被所有 JBoss 配置共享。(不要把你的放在这里)

server                   各种 JBoss 配置。每个配置必须放在不同的子目录。子目录的名字表示配置的名字。 JBoss 包含 3 个默认的配置: minimial default all ,在你安装时可以进行选择。

server/all               JBoss 的完全配置,启动所有服务,包括集群和 IIOP ( 本教程就采用此配置 )

server/default         JBoss 的默认配置。在没有在 JBoss 命令航中指定配置名称时使用。 ( 本教程没有安装此配置,如果不指定配置名称,启动将会出错 )

server/all/conf        JBoss 的配置文件。

server/all/data         JBoss 的数据库文件。比如,嵌入的数据库,或者 JBossMQ

server/all/deploy     JBoss 的热部署目录。放到这里的任何文件或目录会被 JBoss 自动部署。 EJB WAR EAR ,甚至服务。

server/all/lib           一些 JAR JBoss 在启动特定配置时加载他们。 (default minimial 配置也包含这个和下面两个目录。 )

server/all/log          JBoss 的日志文件

server/all/tmp         JBoss 的临时文件。

<!-- [if !supportLists]-->5.   <!-- [endif]-->持久化实体管理器 EntityManager

EntityManager 是由 EJB 容器自动地管理和配置的,通常声明方式如下:

@PersistenceContext(unitName="xxx")

EntityManager em;

unitName 属性的值 xxx 对应 persistence.xml 文件中的 <persistence-unit name="xxx"> 元素的 name 属性的值。如果只有一个持久化内容配置,不需要明确指定。

其常用的 API 如下:

<!-- [if !supportLists]-->n   <!-- [endif]-->增加数据: persist() 方法

<!-- [if !supportLists]-->n   <!-- [endif]-->删除数据: remove() 方法

<!-- [if !supportLists]-->n   <!-- [endif]-->合并数据: merge() 方法

<!-- [if !supportLists]-->n   <!-- [endif]-->查询数据: find() getReference() 方法

<!-- [if !supportLists]-->n   <!-- [endif]-->执行 JPQL 操作: createQuery ()方法

<!-- [if !supportLists]-->n   <!-- [endif]-->执行 SQL 操作 createNativeQuery() 方法

<!-- [if !supportLists]-->6.   <!-- [endif]-->会话Bean

<!-- [if !supportLists]-->A.       <!-- [endif]-->在类名前声明:

@Stateless 注释定义这是一个无状态会话 Bean

@Remote 注释指明 Bean remote 接口

@Local 注释指明 Bean local 接口

@Stateful 注释定义这是一个有状态会话 Bean

@SuppressWarnings("serial") 注释屏蔽缺少 serialVersionUID 定义的警告

注意: Stateless Session Bean Stateful Session Bean 的区别

这两种 Session Bean 都可以将系统逻辑放在方法之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此一个使用者会有自己的一个实例。 Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候, EJB 容器并不会寻找特定的 Stateless Session Bean 的实体来执行这个 method 。换言之,很可能数个使用者在执行某个 Stateless Session Bean methods 时,会是同一个 Bean 的实例在执行。从内存方面来看, Stateful Session Bean Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。

 

<!-- [if !supportLists]-->B.        <!-- [endif]-->如何改变 Session Bean JNDI 名称

默认的 JNDI 命名规则前面已经介绍过,但有些情况下需要自定义名称。要自定义 JNDI 名称,可以使用 @LocalBinding @RemoteBinding 注释:

@LocalBinding 注释指定 Session Bean Local 接口的 JNDI 名称,

@RemoteBinding 注释指定 Session Bean Remote 接口的 JNDI 名称

例如,在类声明之前加上:

<!-- [if !supportLists]-->n   <!-- [endif]-->@Stateless

<!-- [if !supportLists]-->n   <!-- [endif]-->@Remote ({RemoteOperation.class})

<!-- [if !supportLists]-->n   <!-- [endif]-->@RemoteBinding (jndiBinding="xxx/RemoteOperation")

<!-- [if !supportLists]-->n   <!-- [endif]-->@Local ({LocalOperation.class})

<!-- [if !supportLists]-->n   <!-- [endif]-->@LocalBinding (jndiBinding="yyy/LocalOperation")

<!-- [if !supportLists]-->C.       <!-- [endif]-->Session Bean 的生命周期

通过使有下面所列的注释, EJB 3.0 允许你将任何方法指定为回调方法。 EJB 3.0 中, bean 可以有任意数量,任意名字的回调方法。

<!-- [if !supportLists]-->n   <!-- [endif]-->@PostConstruct :当 bean 对象完成实例化后,使用了这个注释的方法会被立即调用。这个注释同时适用于有状态和无状态的会话 bean

<!-- [if !supportLists]-->n   <!-- [endif]-->@PreDestroy :使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的 bean 实例之前调用。这个注释同时适用于有状态和无状态的会话 bean

<!-- [if !supportLists]-->n   <!-- [endif]-->@PrePassivate :当一个有状态的 session bean 实例空闲过长的时间,容器将会钝化 (passivate) 它,并把它的状态保存在缓存当中。使用这个注释的方法会在容器钝化 bean 实例之前调用。这个注释适用于有状态的会话 bean 。当钝化后,又经过一段时间该 bean 仍然没有被操作,容器将会把它从存储介质中删除。以后,任何针对该 bean 方法的调用容器都会抛出例外。

<!-- [if !supportLists]-->n   <!-- [endif]-->@PostActivate :当客户端再次使用已经被钝化的有状态 session bean 时,新的实例被创建,状态被恢复。使用此注释的 session bean 会在 bean 的激活完成时调用。这个注释只适用于有状态的会话 bean

<!-- [if !supportLists]-->n   <!-- [endif]-->@Init :这个注释指定了有状态 session bean 初始化的方法。它区别于 @PostConstruct 注释在于:多个 @Init 注释方法可以同时存在于有状态 session bean 中,但每个 bean 实例只会有一个 @Init 注释的方法会被调用。这取决于 bean 是如何创建的(细节请看 EJB 3.0 规范)。 @PostConstruct @Init 之后被调用。

<!-- [if !supportLists]-->n   <!-- [endif]-->@Remove: 对于有状态 session bean 。当应用通过存根对象调用使用了 @Remove 注释的方法时,容器就知道在该方法执行完毕后,要把 bean 实例从对象池中移走。

<!-- [if !supportLists]-->D.       <!-- [endif]-->拦截器 (Interceptor)

拦截器可以监听程序的一个或所有方法。拦截器对方法调用流提供了细粒度控制。可以在无状态会话 bean 、有状态会话 bean 和消息驱动 bean 上使用它们。拦截器可以是同一 bean 类中的方法或是一个外部类。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics