### EJB 3.0中的注解及其应用详解
#### 一、引言
随着Java技术的发展,EJB (Enterprise JavaBeans) 成为了构建企业级应用程序的重要标准之一。EJB 3.0作为EJB规范的一个重要版本,引入了许多简化开发的新特性,其中最引人注目的是对注解的支持。通过注解,开发者可以更简洁地定义EJB组件的行为,而无需编写大量的XML配置文件。本文将重点介绍EJB 3.0中几个重要的注解及其应用场景。
#### 二、EJB 3.0中的注解
##### 1. @EJB 注解
- **定义**:`@EJB`注解用于将EJB组件注入到客户端代码中。它支持依赖注入(Dependency Injection),使得开发者可以方便地访问远程接口或者本地接口的实例。
- **属性**:
- `beanName`:用于指定被注入的EJB组件的类名,通常不包含包名。
- `mappedName`:用于指定被注入EJB组件的JNDI名称。
- **示例**:
```java
@EJB(beanName = "A")
private IAa ia;
```
在这个例子中,“A”是接口`IAa`的一个实现类。如果该接口只有一个实现类,可以省略`beanName`属性。
**注意事项**:在使用JBoss 4.0.5.GA时,需要注意`@EJB`注解的位置变化,已从`javax.annotation`包移动到了`javax.ejb`包中。
##### 2. @Resource 注解
- **定义**:`@Resource`注解用于注入来自JNDI命名服务的任何资源,比如数据源、消息目的地等。
- **属性**:
- `mappedName`:用于指定资源的JNDI名称。
- **示例**:
```java
@Resource(mappedName = "java:/DefaultMySqlDS")
private DataSource myDb;
```
这里,`"java:/DefaultMySqlDS"`是数据源`DefaultMySqlDS`的全局JNDI名称。如果该资源位于本地JNDI目录(`java:comp/env`),则只需要提供映射名称。
##### 3. 实体Bean及其注解
实体Bean是EJB 3.0中最常用的组件之一,主要用于表示持久化数据的对象。它们通过注解来定义其持久化行为,这些注解主要包括`@Entity`、`@Table`、`@Column`、`@Id`等。
- **配置文件**:实体Bean的配置主要通过`persistence.xml`文件进行管理。该文件位于`Jar`文件的`META-INF`目录下,并且用于指定实体Bean使用的数据源以及`EntityManager`对象的默认行为。
- **示例**:
```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>`元素定义了一个持久化单元,其中`name`属性指定了持久化单元的名称;`<jta-data-source>`元素指定了实体Bean使用的数据源名称;`<properties>`元素用于配置Hibernate的各种属性。
- **注解**:
- `@Entity`:标记在一个Java类上,表示该类是一个实体Bean。
- `@Table`:用于指定实体Bean对应的数据库表名。
- `@Column`:用于定义映射到列的所有属性,包括列名、是否唯一、是否允许为空等。
- `@Id`:用于指定主键属性。
- `@GeneratedValue`:用于定义主键生成策略。
**示例**:
```java
@Entity
@Table(name = "Person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "PersonName", length = 50, nullable = false, unique = true)
private String name;
// Getter and Setter methods
}
```
##### 4. 复合主键 (Composite Primary Key)
- **定义**:当需要使用多个属性变量(表中的多列)联合起来作为主键时,就需要使用复合主键。复合主键要求开发者自定义一个复合主键类。
- **示例**:
```java
@Embeddable
public class CompositeKey implements Serializable {
private String part1;
private int part2;
// Getter and Setter methods
}
@Entity
@Table(name = "CompositeKeyExample")
public class Example {
@EmbeddedId
private CompositeKey id;
// Other fields and methods
}
```
#### 三、总结
EJB 3.0通过引入注解极大地简化了企业级应用程序的开发流程。本文介绍了几个常用的注解及其应用场景,包括`@EJB`、`@Resource`以及实体Bean相关的注解。掌握这些注解的使用方法可以帮助开发者更加高效地开发EJB应用。此外,复合主键的概念也为企业级应用程序提供了更多的灵活性。未来,随着Java技术的不断发展,EJB标准也会不断进化,开发者们需要持续关注最新的技术和最佳实践。