JPA 主键@Id、@IdClass、@Embeddable、@EmbeddedId

来源:互联网 发布:strider军刀 淘宝 编辑:程序博客网 时间:2024/03/29 21:43

1、自动主键
默认情况下,主键是一个连续的64位数字(long),它由ObjectDB自动为存储在数据库中的每个新实体对象自动设置。数据库中的第一个实体对象的主键是1,第二个实体对象的主键是2等等。当从数据库中删除实体对象时,主键值不会被回收。
一个实体的主键值可以通过声明一个主键字段来访问:

@Entitypublic class Project {    @Id @GeneratedValue long id; // still set automatically}

@id标注将字段标记为一个主键字段。当定义主键字段时,主键值将被ObjectDB自动注入到该字段中。
@generatedvalue注释指定主键是由ObjectDB自动分配的
2、应用设置主键
如果一个实体有一个没有@generatedvalue标记的主键字段,则不会生成自动主键值,并且应用程序负责通过初始化主键字段来设置主键。这必须在持久化实体对象的任何尝试之前完成。

@Entitypublic class Project {    @Id long id; // must be initialized by the application}

应用程序设置的主键字段可以有以下类型:
● 原始类型: boolean, byte, short, char, int, long, float, double.
● java.lang包中的包装类型:Byte, Short, Character, Integer, Long, Float, Double.
● java.math.BigInteger, java.math.BigDecimal.
● java.lang.String.
● java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp.
● 枚举类型
● 引用一个实体对象
3、复合主键
复合主键由多个主键字段组成。每个主键字段必须是上面列出的支持类型之一。
例如,以下项目实体类的主键由两个字段组成:

@Entity @IdClass(ProjectId.class)public class Project {    @Id int departmentId;    @Id long projectId;}

当一个实体有多个主键字段时,JPA需要定义一个特殊的ID类,该类是使用@idclass注释附加到实体类的。ID类反映了主键字段,它的对象可以表示主键值:

Class ProjectId {    int departmentId;    long projectId;}

ObjectDB不强制定义ID类。但是,如果实体对象必须按照检索实体部分中所示的主键来检索实体对象,那么就需要ID类。

4、嵌入式主键
表示复合主键的另一种方法是使用可嵌入的类:

@Entitypublic class Project {    @EmbeddedId ProjectId id;}@EmbeddableClass ProjectId {    int departmentId;    long projectId;}

主键字段是在可嵌入类中定义的。该实体包含一个单独的主键字段,该字段用@EmbeddedId 注释,并包含一个可嵌入类的实例。当使用这个表单时,没有定义一个单独的ID类,因为可嵌入的类本身可以表示完整的主键值。