EJB中的注释

来源:互联网 发布:Java工程打包 编辑:程序博客网 时间:2024/06/05 10:06
1EJB写法
         EJB注释,其常用属性如下:
beanName:指定EJB的类名(不带包名),
mappedName:指定Bean实例的JNDI名。
    例如:
     @Column(name = "id", unique="true")
     public getId()
    {   
          return this.id;
    }

     A . @Column(name=A)
         就是对应其JNDI的列名,如数据库表中有id列,所以name="id".
 
B.依赖注入之@Resource
@Resource注释,注入来自JNDI的任何资源。
例如:
@Resource (mappedName="java:/DefaultMySqlDS")
DataSource myDb;
"java:/DefaultMySqlDS"是数据源DefaultMySqlDS的全局JNDI名。如果JNDI对象在本地(java:comp/env)JNDI目录中,则只需给定它的映射名称即可。
2实体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会自动给你一个默认的无参的构造函数的。但是当你自己写了有参数的构造函数时,千万别忘记了加上一个无参的构造函数,最好的习惯就是在建类的就把无参构造函数写上,这样就不会出错了。(以前在写Hibernate的bean时其实也有这么一条原则的,只是当时写的那些bean从没写过有参的构造函数,所以一时没有发现这条原则)。
A.写在类声明之前的有:
a.@Entity,以表明此Bean为EntityBean。
b.@Table(name=”TableName”),表示此实体Bean对应的数据库表名。
B.写在getXxx()方法声明之前的有:
a.@Column注释定义了映射到列的所有属性,如列名是否唯一,是否允许为空,是否允许更新等,他的属性介绍如下:
· name: 映射的列名。如:映射Person表的PersonName列,可以在name属性的getName 方法上面加入@Column(name = "PersonName"),如果不指定映射列名,容器将属性名称作为默认的映射列名。
·unique: 是否唯一
·nullable: 是否允许为空
·length: 对于字符型列,length属性指定列的最大字符长度
·insertable: 是否允许插入
·updatable: 是否允许更新
·columnDefinition: 定义建表时创建此列的DDL
·secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
b.@Id 注释指定personid属性为表的主键,它可以有多种生成方式:
·TABLE:容器指定用底层的数据表确保唯一。
·SEQUENCE:使用数据库的SEQUENCE 列来保证唯一
·IDENTITY:使用数据库的INDENTIT列来保证唯一
·AUTO:由容器挑选一个合适的方式来保证唯一
·NONE:容器不负责主键的生成,由调用程序来完成。
c.@GeneratedValue注释定义标识字段的生成方式。
3复合主键(Composite Primary Key)
当需要使用多个属性变量(表中的多列)联合起来作为主键时,我们需要使用复合主键。复合主键要求我们编写一个复合主键类( Composite Primary Key Class )。复合主键类需要符合以下一些要求:
·复合主键类必须是public,必须具备一个没有参数的构造函数
·复合主键类的每个属性变量必须有getter/setter,如果没有,每个属性变量则必须是public或者protected
·复合主键类必须实现java.io.Serializable接口
·复合主键类必须重写equals()和hashcode()方法
·复合主键类中的主键属性变量的名字必须和对应的EntityBean中主键属性变量的名字相同
·一旦主键值设定后,不要修改主键属性变量的值
4JBoss的目录结构
安装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的临时文件。
5持久化实体管理器EntityManager
EntityManager 是由EJB容器自动地管理和配置的,通常声明方式如下:
@PersistenceContext(unitName="xxx")
EntityManager em;
unitName属性的值xxx对应persistence.xml文件中的<persistence-unit name="xxx">元素的name属性的值。如果只有一个持久化内容配置,不需要明确指定。
其常用的API如下:
A.     增加数据:persist()方法
B.       删除数据:remove()方法
C.       修改数据:merge()方法
D.      查询数据:find()方法
E.执行EJB3 QL 操作:createQuery()方法
6会话Bean
在类名前声明:
@Stateless 注释定义这是一个无状态会话Bean
@Remote 注释指明Bean的remote 接口
@Local 注释指明Bean的local接口
@Stateful 注释定义这是一个有状态会话Bean
@SuppressWarnings("serial") 注释屏蔽缺少serialVersionUID 定义的警告
注意:Stateless Session BeanStateful 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的优势却在于他可以维持使用者的状态。
如何改变Session BeanJNDI 名称:
默认的JNDI命名规则前面已经介绍过,但有些情况下需要自定义名称。要自定义JNDI名称,可以使用@LocalBinding 和 @RemoteBinding 注释:
@LocalBinding注释指定Session Bean的Local接口的JNDI名称,
@RemoteBinding注释指定Session Bean的Remote接口的JNDI名称
例如,在类声明之前加上:
@Stateless
@Remote ({RemoteOperation.class})
@RemoteBinding (jndiBinding="xxx/RemoteOperation")
@Local ({LocalOperation.class})
@LocalBinding (jndiBinding="yyy/LocalOperation")
Session Bean 的生命周期:
通过使有下面所列的注释,EJB 3.0允许你将任何方法指定为回调方法。EJB 3.0中,bean可以有任意数量,任意名字的回调方法。
·@PostConstruct:当bean对象完成实例化后,使用了这个注释的方法会被立即调用。这个注释同时适用于有状态和无状态的会话bean。
·@PreDestroy:使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的bean 实例之前调用。这个注释同时适用于有状态和无状态的会话bean。
·@PrePassivate:当一个有状态的session bean实例空闲过长的时间,容器将会钝化(passivate)它,并把它的状态保存在缓存当中。使用这个注释的方法会在容器钝化bean实例之前调用。这个注释适用于有状态的会话bean。当钝化后,又经过一段时间该bean 仍然没有被操作,容器将会把它从存储介质中删除。以后,任何针对该bean方法的调用容器都会抛出例外。
·@PostActivate:当客户端再次使用已经被钝化的有状态session bean时,新的实例被创建,状态被恢复。使用此注释的session bean会在bean的激活完成时调用。这个注释只适用于有状态的会话bean。
·@Init:这个注释指定了有状态session bean初始化的方法。它区别于@PostConstruct注释在于:多个@Init注释方法可以同时存在于有状态session bean 中,但每个bean实例只会有一个@Init注释的方法会被调用。这取决于bean是如何创建的(细节请看EJB 3.0规范)。@PostConstruct在@Init之后被调用。
·@Remove: 对于有状态session bean。当应用通过存根对象调用使用了@Remove注释的方法时,容器就知道在该方法执行完毕后,要把bean实例从对象池中移走。
拦截器(Interceptor):
拦截器可以监听程序的一个或所有方法。拦截器对方法调用流提供了细粒度控制。可以在无状态会话 bean、有状态会话 bean 和消息驱动 bean 上使用它们。拦截器可以是同一 bean 类中的方法或是一个外部类。
@Interceptors 注释指定一个或多个在外部类中定义的拦截器。例如:
@Interceptors({Xxx.class})
public class A implements IA{
        …
        …
}
在此Xxx拦截器对A类中的所有方法进行拦截。
Xxx类中,使用
@AroundInvoke 注释指定了要用作拦截器的方法。用@AroundInvoke注释指定的方法必须遵守以下格式:
public Object xxxInvocationContext ctx)throws Exception
xxx 代表方法名可以任意。
除了可以在外部定义拦截器之外,还可以将Session Bean 中的一个或多个方法定义为拦截器。只需一个
@AroundInvoke 注释就指定了要用作拦截器的方法。其定义规则如上所述。
7JBoss数据源的配置
Jboss有一个默认的数据源DefaultDS,它使用Jboss内置的HSQLDB数据库。实际应用中你可能使用不同的数据库,如MySql、MsSqlServer、Oracle等。各种数据库的数据源配置模版你可以在[Jboss安装目录]\docs\examples\jca 目录中找到,默认名称为:数据库名+ -ds.xml 。
0 0
原创粉丝点击