`
longgangbai
  • 浏览: 7332206 次
  • 性别: 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 类中的方法或是一个外部类。

分享到:
评论

相关推荐

    韩顺平编写的java学习笔记(全)

    ### 韩顺平编写的Java学习笔记概览 #### Java平台分类与运行机制 - **J2SE(Java 2 Platform, Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java 2 Platform, Enterprise ...

    韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全).doc

    4. Java 注释:Java 中有两种注释方式:单行注释(//)和多行注释(/* */) Java SE 1. Java SE 是 Java 的基础知识,涵盖 Java 面向对象编程、图形界面开发、数据库编程、文件 IO 流编程、网络编程、多线程编程等...

    JAVA学习笔记1

    ### JAVA学习笔记1:深入解析J2EE框架与关键技术 #### J2EE模式与Value Object概念 在JAVA学习之旅中,深入理解J2EE(Java 2 Platform, Enterprise Edition)框架是至关重要的一步。J2EE是专为开发企业级应用而...

    java私塾学习笔记整理

    ### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...

    java学习笔记

    ### Java学习笔记知识点详解 #### Java 平台与开发概述 - **Java平台分类:** - **J2SE(Java SE):** 标准版,适用于桌面应用程序开发。 - **J2EE(Java EE):** 企业版,专为Web应用和服务端应用程序设计。 -...

    web学习笔记.pdf

    Web技术的学习笔记涵盖了从基础的JSP引擎工作原理到高级的框架如Struts1和Struts2的使用。首先,JSP(JavaServer Pages)是Java平台上的动态网页技术,当Web容器接收到以JSP为扩展名的URL请求时,会交由JSP引擎处理...

    韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全).docx

    本资源为韩顺平 Java 从入门到精通视频教程的学习笔记,涵盖了 Java 基础知识、面向对象编程、图形界面开发、数据库编程、文件IO流编程、网络编程、多线程编程等方面的知识点,是学习 Java 语言的不二之选。

    eclipse-java学习笔记

    3. **跟踪源码**:通过`Ctrl+单击`可以在源码中导航,快速查看方法或类的定义,这对于理解和调试代码非常有用。 4. **编辑位置切换**:`Alt+左右方向键`可以在编辑历史之间切换,让你快速回到之前的编辑位置。 5. ...

    JAVASE学习笔记

    ### JAVASE学习笔记 #### 一、Java概述与版本介绍 **1.1 Java的三个版本** - **JavaSE (Standard Edition)**: 标准版,主要用于桌面应用程序的开发。 - **JavaEE (Enterprise Edition)**: 企业版,专为大型企业级...

    java学习笔记整理(齐全).doc

    ### Java 学习笔记知识点梳理 #### Java 平台概述 - **J2SE(Java 2 Platform Standard Edition)**: 标准版平台,适用于桌面应用程序的开发。 - **J2EE(Java 2 Platform Enterprise Edition)**: 企业版平台,...

    优秀程序员必须看得学习笔记

    从给定的文件信息中,我们可以提炼出一系列重要的IT知识点,特别是针对Java编程语言的关键概念和技术。以下是对这些知识点的详细解析: ### Java学习路径与认证 - **SCJP**: Sun Certified Java Programmer,主要...

    韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    ### 韩顺平Java从入门到精通视频教程学习笔记整理 #### Java开发平台与运行机制 - **J2SE(Java 2 Platform Standard Edition)**:Java的标准版平台,适用于开发桌面应用程序,包含了Java的核心类库和技术。 - **...

    韩顺平java视频教程(全94讲)学习笔记整理

    ### 韩顺平Java视频教程(全94讲)学习笔记整理 #### Java平台概述 - **J2SE(Java Platform Standard Edition)**: 标准版Java开发平台,适用于桌面应用程序开发。 - **J2EE(Java Platform Enterprise Edition)**...

    51CTO下载-韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    - **EJB (Enterprise JavaBeans)**:一种服务器端组件模型,用于构建可重用的组件。 - **Hibernate**:一个 ORM (对象关系映射) 框架,用于简化数据库访问。 - **Spring**:一个轻量级的 IoC 容器和 AOP 框架,用于...

    李兴华java word版全部笔记

    这个压缩包中的Word文档格式使得笔记易于阅读和编辑,对于学习者来说,可以方便地做笔记、添加注释或进行个性化整理。在学习过程中,结合实际编程练习,可以更好地理解和掌握Java编程技能,从而提升编程能力。

    我的智囊团源代码part3

    《我的智囊团源代码part3》是针对J2EE技术学习的一个重要资源,由知名讲师李兴华分享。这个项目旨在帮助开发者深入理解和实践J2EE的核心概念,提升在企业级应用开发中的技能。由于文件大小的限制,源代码被拆分为四...

Global site tag (gtag.js) - Google Analytics