`
Ben.Sin
  • 浏览: 233191 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

转-JPA 批注参考(5)

阅读更多

来源:www.oracle.com
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
本文的主要内容如下:

详细解释了下面9个批注的含义及其批注所包含的属性:
@MapKey
@MappedSuperclass
@NamedNativeQueries
@NamedNativeQuery
@NamedQueries
@NamedQuery
@OneToMany
@OneToOne
@OrderBy

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

 

@MapKey

默认情况下,JPA 持续性提供程序假设关联实体的主键为 java.util.Map 类型的关联的 Map 键:

如果主键是批注为 @Id 的非复合主键,则该字段或属性的类型实例将用作 Map 键。

如果主键是批注为 @IdClass 的复合主键,则主键类的实例将用作 Map 键。

使用 @MapKey 批注:

● 将某个其他字段或属性指定为 Map 键(如果关联实体的主键不适合于应用程序)

● 指定一个嵌入的复合主键类(请参阅 @EmbeddedId)

● 指定的字段或属性必须具有唯一约束(请参阅 @UniqueConstraint)。

表 1-24 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-24 @MapKey 属性

 

属性

必需

说明

name

默认值 :默认情况下,JPA 持续性提供程序将关联实体的主键作为 Map 键,以用于映射到非复合主键或复合主键(批注为 @IdClass)的 java.util.Map 的属性或字段。
如果要将某个其他字段或属性用作 Map 键,请将 name 设置为要使用的关联实体的 String 字段或属性名。

在示例 1-52 中,Project 对作为 Map 的 Employee 实例拥有一对多关系。示例 1-52 显示了如何使用 @MapKey 批注指定此 Map 的键为 Employee 字段 empPK,它是一个类型为 EmployeePK(请参阅示例 1-52)的嵌入式复合主键(请参阅示例 1-51)。

示例 1-50 使用 @MapKey 的 Project 实体

@Entity
public class Project {
    ...
    @OneToMany(mappedBy="project")   
    @MapKey(name="empPK")
    public Map<EmployeePK, Employee> getEmployees() {
    ...
    }
    ...
}

示例 1-51 Employee 实体

@Entity
public class Employee {
    @EmbeddedId
    public EmployeePK getEmpPK() {
     ...
    }
    ...
    @ManyToOne
    @JoinColumn(name="proj_id")
    public Project getProject() {
    ...
    }
...
}

示例 1-52 EmployeePK 复合主键类

@Embeddable
public class EmployeePK {
    String name;
    Date birthDate;
}

@MappedSuperclass

默认情况下,JPA 持续性提供程序假设实体的所有持久字段均在该实体中定义。

使用 @MappedSuperclass 批注指定一个实体类从中继承持久字段的超类。当多个实体类共享通用的持久字段或属性时,这将是一个方便的模式。

您可以像对实体那样使用任何直接和关系映射批注(如 @Basic 和 @ManyToMany)对该超类的字段和属性进行批注,但由于没有针对该超类本身的表存在,因此这些映射只适用于它的子类。继承的持久字段或属性属于子类的表。

可以在子类中使用 @AttributeOverride 或 @AssociationOverride 批注来覆盖超类的映射配置。

该批注没有属性。有关更多详细信息,请参阅 API

示例 1-53 显示了如何使用此批注将 Employee 指定为映射超类。示例 1-54 显示了如何扩展实体中的此超类,以及如何在实体类中使用 @AttributeOverride 以覆盖超类中设置的配置。

示例 1-53 @MappedSuperclass

@MappedSuperclass
public class Employee {
@Id
protected Integer empId;

@Version
protected Integer version;

@ManyToOne
@JoinColumn(name="ADDR")
protected Address address;

public Integer getEmpId() {
        ...
    }

public void setEmpId(Integer id) {
        ...
    }

public Address getAddress() {
        ...
    }

public void setAddress(Address addr) {
        ...
    }
}

示例 1-54 扩展 @MappedSuperclass

@Entity
@AttributeOverride(name="address", column=@Column(name="ADDR_ID"))
public class PartTimeEmployee extends Employee {

@Column(name="WAGE")
protected Float hourlyWage;

public PartTimeEmployee() {
        ...
    }

public Float getHourlyWage() {
        ...
    }

public void setHourlyWage(Float wage) {
        ...
    }
}


@NamedNativeQueries

如果需要指定多个 @NamedNativeQuery,则必须使用一个 @NamedNativeQueries 批注指定所有命名查询。

表 1-25 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-25 @NamedNativeQueries 属性

 

属性

必需

说明

value

要指定两个或更多属性覆盖,请将 value 设置为 NamedNativeQuery 实例数组(请参阅 @NamedNativeQuery)。

示例 1-55 显示了如何使用此批注指定两个命名原生查询。

示例 1-55 @NamedNativeQueries

@Entity
@NamedNativeQueries({
@NamedNativeQuery(
name="findAllPartTimeEmployees",
query="SELECT * FROM EMPLOYEE WHERE PRT_TIME=1"
    ),
@NamedNativeQuery(
name="findAllSeasonalEmployees",
query="SELECT * FROM EMPLOYEE WHERE SEASON=1"
    )
})
public class PartTimeEmployee extends Employee {
    ...
}


@NamedNativeQuery

在使用 JPA 持续性提供程序的应用程序中,可以使用实体管理器动态创建和执行查询,也可以预定义查询并在运行时按名称执行。

使用 @NamedNativeQuery 批注创建与 @Entity 或 @MappedSuperclass 关联的预定义查询,这些查询:

● 使用基础数据库的原生 SQL

● 经常被使用

● 比较复杂并且难于创建

● 可以在不同实体之间共享

● 返回实体、标量值或两者的组合(另请参阅 @ColumnResult、@EntityResult、@FieldResult 和@SqlResultSetMapping)

如果有多个要定义的 @NamedNativeQuery,则必须使用 @NamedNativeQueries。

要预定义适合于任何数据库的可移植查询,请参阅 @NamedQuery。

表 1-26 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-26 @NamedNativeQuery 属性

 

属性

必需

说明

query

要指定查询,请将 query 设置为 SQL 查询(作为 String)。
有关原生 SQL 查询语言的详细信息,请参阅数据库文档。
hints

默认值 :空 QueryHint 数组。
默认情况下,JPA 持续性提供程序假设 SQL 查询应完全按照 query 属性提供的方式执行。
要微调查询的执行,可以选择将 hints 设置为一个 QueryHint 数组(请参阅 @QueryHint)。在执行时,EntityManager 将向基础数据库传递提示。
name

要指定查询名称,请将 name 设置为所需的 String 名称。
这是您在运行时调用查询所使用的名称(请参阅示例 1-56)。
resultClass

默认值 :JPA 持续性提供程序假设结果类是关联实体的 Class。
要指定结果类,请将 resultClass 设置为所需的 Class。
resultSetMapping

默认值 :JPA 持续性提供程序假设原生 SQL 查询中的 SELECT 语句:返回一个类型的实体;包括与返回的实体的所有字段或属性相对应的所有列;并使用与字段或属性名称(未使用 AS 语句)相对应的列名。
要控制 JPA 持续性提供程序如何将 JDBC 结果集映射到实体字段或属性以及标量,请通过将 resultSetMapping 设置为所需的 @SqlResultSetMapping 的 String 名称来指定结果集映射。

示例 1-56 显示了如何使用 @NamedNativeQuery 批注定义一个使用基础数据库的原生 SQL 的查询。示例 1-57 显示了如何使用 EntityManager 获取此查询以及如何通过 Query 方法 getResultList 执行该查询。

示例 1-56 使用 @NamedNativeQuery 实现一个 Oracle 层次查询

@Entity
@NamedNativeQuery(
name="findAllEmployees",
query="SELECT * FROM EMPLOYEE"
)
public class Employee implements Serializable {
    ...
}

示例 1-57 执行一个命名原生查询

Query queryEmployees = em.createNamedQuery("findAllEmployees");
Collection employees = queryEmployees.getResultList();

@NamedQueries

如果需要指定多个 @NamedQuery,则必须使用一个 @NamedQueries 批注指定所有命名查询。

表 1-27 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-27 @NamedQueries 属性

 

属性

必需

说明

value

要指定两个或更多属性覆盖,请将 value 设置为 NamedQuery 实例数组(请参阅 @NamedQuery)。

示例 1-58 显示了如何使用此批注指定两个命名查询。

示例 1-58 @NamedQueries

@Entity
@NamedQueries({
@NamedQuery(
name="findAllEmployeesByFirstName",
query="SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = :firstname"
    ),
@NamedQuery(
name="findAllEmployeesByLasttName",
query="SELECT OBJECT(emp) FROM Employee emp WHERE emp.lasstName = :lastname"
    )
})
public class PartTimeEmployee extends Employee {
    ...
}

@NamedQuery

在使用 JPA 持续性提供程序的应用程序中,可以使用实体管理器动态创建和执行查询,也可以预定义查询并在运行时按名称执行。

使用 @NamedQuery 批注创建与 @Entity 或 @MappedSuperclass 关联的预定义查询,这些查询:

● 使用 JPA 查询语言(请参阅 JSR-000220 Enterprise JavaBeans v3.0 规范,第 4 章)进行基于任何基础数据库的可移植执行

● 经常被使用

● 比较复杂并且难于创建

● 可以在不同实体之间共享

● 只返回实体(从不返回标量值),并只返回一个类型的实体

如果有多个要定义的 @NamedQuery,则必须使用 @NamedQueries。

要在已知的基础数据库中预定义原生 SQL 查询,请参阅 @NamedNativeQuery。使用原生 SQL 查询,您可以返回实体(包括不同类型的实体)、标量值或同时返回两者。

表 1-28 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-28 @NamedQuery 属性

 

属性

必需

说明

query

要指定查询,请将 query 设置为 JPA 查询语言(作为 String)。
有关 JPA 查询语言的详细信息,请参阅
JSR-000220 Enterprise JavaBeans v.3.0 规范的第 4 章。
hints

默认值 :空 QueryHint 数组。
默认情况下,JPA 持续性提供程序假设 SQL 查询应完全按照 query 属性提供的方式执行,而不管基础数据库如何。
如果您知道基础数据库在运行时的状态,则要微调查询的执行,可以选择将 hints 设置为 QueryHint 数组(请参阅 @QueryHint)。在执行时,EntityManager 将向基础数据库传递提示。
name

要指定查询名称,请将 name 设置为查询名称(作为 String)。
这是您在运行时调用查询所使用的名称(请参阅示例 1-59)。

示例 1-59 显示了如何使用 @NamedQuery 批注定义一个JPA 查询语言查询,该查询使用名为 firstname 的参数。示例 1-60 显示了如何使用 EntityManager 获取此查询并使用 Query 方法 setParameter 设置 firstname 参数。

示例 1-59 使用 @NamedQuery 实现一个带参数的查询

@Entity
@NamedQuery(
name="findAllEmployeesByFirstName",
query="SELECT OBJECT(emp) FROM Employee emp WHERE emp.firstName = :firstname"
)
public class Employee implements Serializable {
    ...
}

示例 1-60 执行命名查询

Query queryEmployeesByFirstName = em.createNamedQuery("findAllEmployeesByFirstName");
queryEmployeeByFirstName.setParameter("firstName", "John");
Collection employees = queryEmployessByFirstName.getResultList();

@OneToMany

默认情况下,JPA 为具有一对多多重性的多值关联定义一个 OneToMany 映射。

使用 @OneToMany 批注:

● 将获取类型配置为 LAZY

● 由于所使用的 Collection 不是使用一般参数定义的,因此配置关联的目标实体

● 配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标

● 配置持续性提供程序对单向一对多关系使用的连接表(请参阅 @JoinTable)的详细信息

表 1-29 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-29 @OneToMany 属性

 

属性

必需

说明

cascade

默认值 :CascadeType 的空数组。
默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。
如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括:
● ALL - 针对拥有实体执行的任何持续性操作均层叠到关联的目标。
● MERGE - 如果合并了拥有实体,则将 merge 层叠到关联的目标。
● PERSIST - 如果持久保存拥有实体,则将 persist 层叠到关联的目标。
● REFRESH - 如果刷新了拥有实体,则 refresh 为关联的层叠目标。
● REMOVE - 如果删除了拥有实体,则还删除关联的目标。

fetch

默认值 :FetchType.EAGER。
默认情况下,JPA 持续性提供程序使用获取类型 EAGER:它要求持续性提供程序运行时必须急性获取数据。
如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:它提示持续性提供程序在首次访问数据(如果可以)时应惰性获取数据。
mappedBy

默认值 :如果关系是单向的,则该持续性提供程序确定拥有该关系的字段。
如果关系是双向的,则将关联相反(非拥有)方上的 mappedBy 元素设置为拥有此关系的字段或属性的名称(如示例 1-61 所示)。
targetEntity

默认值 :使用一般参数定义的 Collection 的参数化类型。
默认情况下,如果使用通过一般参数定义的 Collection,则持续性提供程序将从被引用的对象类型推断出关联的目标实体。
如果 Collection 不使用一般参数,则必须指定作为关联目标的实体类:将关联拥有方上的 targetEntity 元素设
置为作为关系目标的实体的 Class。

示例 1-61 和示例 1-62 显示了如何使用此批注在使用一般参数的 Customer(被拥有方)和 Order(拥有方)之间配置一个一对多映射。

示例 1-61 @OneToMany - 使用一般参数的 Customer 类

@Entity
public class Customer implements Serializable {
    ...
@OneToMany(cascade=ALL, mappedBy="customer")
public Set<Order> getOrders() {
return orders;
    }
    ...
}

示例 1-62 @ManyToOne - 使用一般参数的 Order 类

@Entity
public class Customer implements Serializable {
    ...
@ManyToOne
@JoinColumn(name="CUST_ID", nullable=false)
public Customer getCustomer() {
return customer;
    }
    ...
}


@OneToOne

默认情况下,JPA 为指向另一个具有一对一多重性的实体的单值关联定义一个 OneToOne 映射,并从被引用的对象类型推断出关联的目标实体。

使用 @OneToOne 批注:

● 将获取类型配置为 LAZY

● 如果空值不适合于应用程序,则将映射配置为禁止空值(针对非基元类型)

● 配置关联的目标实体(如果无法从被引用的对象类型推断出它)

● 配置必须层叠到关联目标的操作:例如,如果删除了拥有实体,则确保还删除关联的目标

表 1-30 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-30 @OneToOne 属性

 

属性

必需

说明

cascade

默认值 :CascadeType 的空数组。
默认情况下,JPA 不会将任何持续性操作层叠到关联的目标。
如果希望某些或所有持续性操作层叠到关联的目标,请将 cascade 设置为一个或多个 CascadeType 实例,其中包括:
● ALL - 针对拥有实体执行的任何持续性操作均层叠到关联的目标。
● MERGE - 如果合并了拥有实体,则将 merge 层叠到关联的目标。
● PERSIST - 如果持久保存拥有实体,则将 persist 层叠到关联的目标。
● REFRESH - 如果刷新了拥有实体,则 refresh 为关联的层叠目标。
● REMOVE - 如果删除了拥有实体,则还删除关联的目标。

fetch

默认值 :FetchType.EAGER。
默认情况下,JPA 持续性提供程序使用获取类型 EAGER:它要求持续性提供程序运行时必须急性获取数据。
如果这不适合于应用程序或特定的持久字段,请将 fetch 设置为 FetchType.LAZY:它提示持续性提供程序在首次访问数据(如果可以)时应惰性获取数据。
mappedBy

默认值 :如果关系是单向的,则该持续性提供程序确定拥有该关系的字段。
如果关系是双向的,则将关联相反(非拥有)方上的 mappedBy 元素设置为拥有此关系的字段或属性的名称(如示例 1-64 所示)。

optional

默认值 :true。
默认情况下,JPA 持续性提供程序假设所有(非基元)字段和属性的值可以为空。
如果这并不适合于您的应用程序,请将 optional 设置为 false。
targetEntity

默认值 :JPA 持续性提供程序从被引用的对象类型推断出关联的目标实体。
如果持续性提供程序无法推断出目标实体的类型,则将关联的拥有方上的 targetEntity 元素设置为作为关系目标的实体的 Class。

示例 1-63 和示例 1-64 显示了如何使用此批注在 Customer(拥有方)和 CustomerRecord(被拥有方)之间配置一个一对一映射。

示例 1-63 @OneToOne - Customer 类

@Entity
public class Customer implements Serializable {
    ...
@OneToOne(optional=false)
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false)
public CustomerRecord getCustomerRecord() {
return customerRecord;
    }
    ...
}

示例 1-64 @OneToOne - CustomerRecord 类

@Entity
public class CustomerRecord implements Serializable {
    ...
@OneToOne(optional=false, mappedBy="customerRecord")
public Customer getCustomer() {
return customer;
    }
    ...
}


@OrderBy

默认情况下,JPA 持续性提供程序按关联实体的主键以升序顺序检索 Collection 关联的成员。

将 @OrderBy 批注与 @OneToMany 和 @ManyToMany 一起使用以便:

● 指定一个或多个作为排序依据的其他字段或属性

● 为每个这样的字段或属性名指定不同的排序(升序或降序)

表 1-31 列出了此批注的属性。有关更多详细信息,请参阅 API

表 1-31 @OrderBy 属性

 

属性

必需

说明

value

默认值 :JPA 持续性提供程序按关联实体的主键以升序顺序检索 Collection 关联的成员。
如果要按某些其他字段或属性排序并指定了不同的排序,则将 value 设置为以下元素的逗号分隔列表:"property-or-field-name ASC|DESC”(请参阅示例 1-65)。

示例 1-65 显示了如何使用 @OrderBy 批注指定 Project 方法 getEmployees 应按 Employee 字段 lastname 以升序顺序并按 Employee 字段 seniority 以降序顺序返回 Employee 的 List。示例 1-66 显示了默认情况下,Employee 方法 getProjects 按 Employee 主键 empId 以升序顺序返回 List。

示例 1-65 Project 实体

@Entity public class Project {
    ...
@ManyToMany
@OrderBy("lastname ASC", "seniority DESC")
public List<Employee> getEmployees() {
    ...
    };
    ...
}

示例 1-66 Employee 实体

@Entity public class Employee {
@Id
private int empId;
    ...
private String lastname;
    ...
private int seniority;
    ...
@ManyToMany(mappedBy="employees")
// By default, returns a List in ascending order by empId
public List<Project> getProjects() {
    ...
    };
    ...
}

分享到:
评论

相关推荐

    java JPA 批注参考

    Java 持续性API(JPA)是Java EE 5和Java SE 5中引入的一个标准,它简化了对象关系映射(ORM)的过程,允许开发者以声明式的方式定义Java对象如何与关系数据库中的表进行映射。JPA通过使用批注(Annotations)来配置...

    JPA 批注 参考

    总结,JPA批注参考涵盖了从基础的实体定义、主键策略、属性映射到复杂的关联关系、查询语言、存储过程调用、事务处理等多个方面,是Java开发中进行数据库操作的重要工具。通过合理运用批注,开发者能够高效地实现ORM...

    1_JPA_批注参考.

    **JPA批注详解** Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的数据。它提供了一种面向对象的方式来处理数据库操作,使得开发人员可以使用Java对象来代表数据库中的表和记录。JPA的...

    JPA 批注参考Java JPA

    以下是JPA批注的一些主要类别和用法: 1. **实体(Entities)**: - `@Entity`:标记一个Java类为JPA实体,使其能够被用于JPA服务。实体类默认对应于数据库中的表,其字段对应于表中的列。 2. **数据库模式属性**...

    JPA详细文档(JPA 批注参考)

    以下是一些重要的JPA批注及其用途: 1. **实体批注**: - `@Entity`:用于标记一个Java类为JPA实体,使其可用于JPA服务。如果不使用此批注,JPA提供程序会认为类是非持久化的。 2. **数据库模式属性批注**: - `...

    JPA批注参考.JPA批注参考.

    ### JPA批注详解 #### 一、概述 Java Persistence API (JPA) 是 Java 社区标准 JSR-317 的一部分,它提供了一种面向对象的方式来处理数据库操作,极大地方便了开发人员对数据库的操作。在 JPA 中,批注...

    JPA批注参考(主要介绍JPA中的相关注解)

    ### JPA批注参考 Java Persistence API (JPA) 是 Java 平台中用于处理对象关系映射(ORM)的标准接口。它简化了 Java 应用程序与关系型数据库之间的交互,使得开发者能够以面向对象的方式来操作数据库。本文将详细...

    JPA批注参考.htm

    JPA批注参考,大家在使用Hibernate annotation和EJB3中的entity时都可以拿来作参考

    JPA 批注参考-精心整理版

    ### JPA 批注参考-精心整理版 #### 按类别划分的JPA批注 JPA(Java Persistence API)是Java平台上的一个标准,用于处理对象与关系数据库之间的映射问题。JPA允许开发者使用注解的方式,将Java对象映射到数据库表...

    JPA_批注参考

    ### JPA批注参考知识点详解 #### 一、概述 JPA (Java Persistence API) 是 Java 社区标准 JSR 317 的一部分,它为 Java 应用提供了对象关系映射(ORM)功能。JPA 允许开发者以声明的方式定义 Java 对象与关系型...

    JPA 批注参考(全部).pdf

    ### JPA批注详解 #### 一、概述 Java Persistence API (JPA) 是 Java EE 5 和 EJB 3.0 的一部分,它极大简化了企业级 Java 应用程序中的数据持久化过程。JPA 提供了一种声明式的对象关系映射 (ORM) 方法,允许开发...

    Java持久化参考资料,JPA批注

    `JPA批注参考.chm`文件可能包含了关于JPA批注的详细文档,涵盖了上述所有注解的用法、示例以及最佳实践。通过阅读这份参考资料,开发者可以深入理解JPA批注的使用,提升Java应用的数据库操作效率,同时降低数据访问...

    JPA批注参考

    JPA批注参考,批注还是用的太少了,老记不集一。收集的,备用查询。

    JPA 批注总结参考

    以下是一些主要的JPA批注及其用途: 1. **实体批注 (@Entity)**:用于标记一个Java类为JPA实体,这意味着这个类的实例可以被持久化到数据库。没有@Entity注解的类默认被认为是不可持久化的。 2. **数据库模式属性...

    JPA 批注参考.pdf

    Java Persistence API (JPA) 是 Java 企业版 5 (Java EE 5) 的一部分,它显著简化了 Enterprise Java Beans (EJB) 的持久化机制,并引入了一种声明式的对象关系映射 (ORM) 方法。JPA 允许开发人员通过简单的注解来...

    JPA 批注参考

    ### JPA 批注参考详解 #### 一、概述 Java Persistence API (JPA) 是 Java EE 5 规范中的一个重要组成部分,它极大简化了 EJB 的持久化过程,并提供了一种对象关系映射机制,允许开发人员以声明式的方式来定义如何...

    JPA 批注参考 EJB3.0实体Bean注解详细解析

    ### Java Persistence ...JPA 通过使用批注来简化了实体 Bean 的配置和使用,使得开发者可以更专注于业务逻辑而非底层的数据库交互细节。通过对 JPA 批注的理解和合理运用,可以有效地提高应用程序的开发效率和维护性。

    jpa 批注参考 doc 格式 提供了一个对象关系映射方法

    下面是一些主要的JPA批注及其用途: 1. **实体批注**: - `@Entity`:这个批注用于标识一个Java类为一个JPA实体,使得它可以参与到持久化操作中。如果没有这个批注,JPA提供者会认为类是非持久化的。 2. **数据库...

    jpa批注参考

    ### JPA批注详解 Java持久化API (JPA) 是Java企业版5(JavaEE5) Enterprise JavaBean (EJB) 3.0规范的一部分,它的引入极大地简化了EJB的持久化过程,同时也提供了一种声明式的方法来定义Java对象如何被映射到关系...

Global site tag (gtag.js) - Google Analytics