日期:2014-05-16  浏览次数:20505 次

[转载]JPA 批注参考(2)
@Id

使用 @Id 批注将一个或多个持久字段或属性指定为实体的主键。

对于每个实体,必须至少指定以下项之一:

    *

      一个 @Id
    *

      多个 @Id 和一个 @IdClass(对于复合主键)
    *

      一个 @EmbeddedId

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

默认情况下,JPA 持续性提供程序选择最合适的主键生成器(请参阅 @GeneratedValue)并负责管理主键值:您不必采取任何进一步的操作。如果要使用 JPA 持续性提供程序的默认键生成机制,则不必采取任何进一步的操作。

示例 1-36 显示了如何使用此批注将持久字段 empID 指定为 Employee 表的主键。

示例 1-36 @Id

@Entity  public class Employee implements Serializable {  @Id  private int empID;      ...  } 

@IdClass

使用 @IdClass 批注为实体指定一个复合主键类(通常由两个或更多基元类型或 JDK 对象类型组成)。从原有数据库映射时(此时数据库键由多列组成),通常将出现复合主键。

复合主键类具有下列特征:

    *

      它是一个普通的旧式 Java 对象 (POJO) 类。
    *

      它必须为 public,并且必须有一个 public 无参数构造函数。
    *

      如果使用基于属性的访问,则主键类的属性必须为 public 或 protected。
    *

      它必须是可序列化的。
    *

      它必须定义 equals 和 hashCode 方法。

      这些方法的值相等性的语义必须与键映射到的数据库类型的数据库相等性一致。
    *

      它的字段或属性的类型和名称必须与使用 @Id 进行批注的实体主键字段或属性的类型和名称相对应。

或者,您可以使复合主键类成为由实体拥有的嵌入类(请参阅 @EmbeddedId)。

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

表 1-17 @IdClass 属性
属性

value


必需



要指定复合主键类,请将 value 设置为所需的 Class(请参阅 @AttributeOverride)。

示例 1-37 显示了一个非嵌入的复合主键类。在该类中,字段 empName 和 birthDay 的名称和类型必须对应于实体类中属性的名称和类型。示例 1-38 显示了如何使用这个非嵌入的复合主键类(使用 @IdClass 批注)配置 EJB 3.0 实体。由于实体类字段 empName 和 birthDay 在主键中使用,因此还必须使用 @Id 批注对其进行批注。

示例 1-37 非嵌入的复合主键类

public class EmployeePK implements Serializable  {  private String empName;  private Date birthDay;    public EmployeePK()      {      }    public String getName()      {  return empName;      }    public void setName(String name)      {  empName = name;      }    public long getDateOfBirth()      {  return birthDay;      }    public void setDateOfBirth(Date date)      {  birthDay = date;      }    public int hashCode()      {  return (int) empName.hashCode();      }    public boolean equals(Object obj)      {  if (obj == this) return true;  if (!(obj instanceof EmployeePK)) return false;  if (obj == null) return false;  EmployeePK pk = (EmployeePK) obj;  return pk.birthDay == birthDay && pk.empName.equals(empName);      }  }   

示例 1-38 @IdClass

@IdClass(EmployeePK.class)  @Entity  public class Employee  {  @Id String empName;  @Id Date birthDay;  ...  } 

@Inheritance

默认情况下,JPA 持续性提供程序自动管理继承层次中实体的持续性。

使用 @Inheritance 批注自定义持续性提供程序的继承层次支持,以提高应用程序性能或匹配现有的数据模型。

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

表 1-18 @Inheritance 属性
属性 必需 说明

strategy


可选



默认值:InheritanceType.SINGLE_TABLE。