Hibernate @IdClass @EmbeddedID相关注解

这篇博客介绍了Hibernate中处理复合主键的两种方式:使用@Id和@Embeddable注解,以及使用@EmbeddedId注解。复合主键通常通过嵌入式类来表示,要求此类需实现Serializable并重写equals()和hashCode()方法。同时提到了@IdClass作为另一种选择。

Hibernate Annotations 

Mapping composite primary keys and foreign keys to composite primary keys: 

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2177

引用Composite primary keys use a embedded class as the primary key representation, so you'd use the @Id and @Embeddable annotations. Alternatively, you can use the @EmbeddedId annotation. Note that the dependent class has to be serializable and implements equals()/hashCode(). You can also use @IdClass.

@Entity
public class RegionalArticle implements Serializable {

    @Id
    public RegionalArticlePk getPk() { ... }
}

@Embeddable
public class RegionalArticlePk implements Serializable { ... }       
or alternatively
@Entity
public class RegionalArticle implements Serializable {

    @EmbeddedId
    public RegionalArticlePk getPk() { ... }
}

public class RegionalArticlePk implements Serializable { ... }

hibernate的annotation的文档中提供了三种方法 
  1 将组件类注解为@Embeddable,并将组件的属性注解为@Id 
  2 将组件的属性注解为@EmbeddedId (方便) 
  3 将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id(符合 编程 习惯)
主键类需要序列化(考虑到可能会将数据读写到虚拟内存中),需要重写hashcode()和equals()方法,因为要对联合主键进行比较. 

Hibernate Annotation 联合主键三种写法的例子: 
http://laodaobazi.iteye.com/blog/903236  
Which anotation should I use: @IdClass or @EmbeddedId: 
http://stackoverflow.com/questions/212350/which-anotation-should-i-use-idclass-or-embeddedid 

Compound Primary Keys with Hibernate and JPA Annotations: 
http://jpa.ezhibernate.com/Javacode/learn.jsp?tutorial=15usingcompoundprimarykeys 

@IdClass and @EmbeddedId: 
http://www.coderanch.com/t/452567/ORM/ java /IdClass-EmbeddedId 
<think>好的,我现在需要回答用户关于Java中@Id注解的用法和含义的问题。首先,我得回忆一下自己了解的@Id相关知识。@Id通常和JPA(Java Persistence API)相关,用于指定实体类的主键字段。用户可能是在使用Hibernate或者Spring Data JPA时遇到了这个注解,需要明确它的作用和用法。 接下来,我应该先解释@Id的基本含义。它是用来标识实体类中的主键属性,这样JPA就知道哪个字段对应数据库表的主键列。然后可能需要提到它通常与@GeneratedValue一起使用,用来指定主键的生成策略,比如自增、UUID等。 然后,我需要考虑用户可能的实际使用场景。例如,在一个实体类中如何正确使用@Id注解,可能还需要给出代码示例。比如定义一个User类,其中id字段用@Id标注,并配合@GeneratedValue设置自增策略。这样用户能直观地看到如何应用。 另外,用户可能想知道不同的主键生成策略,比如IDENTITY、SEQUENCE、TABLE和AUTO之间的区别,这也是需要简要说明的。比如IDENTITY对应数据库的自增字段,SEQUENCE使用数据库序列,TABLE通过中间表生成主键,AUTO则由JPA自动选择策略。 还要注意是否需要提到@Id所在的包,即javax.persistence.Id,避免用户混淆其他框架的同名注解。同时,可能存在的常见问题,比如忘记添加无参构造方法导致持久化失败,或者主键类型不匹配的问题,这些也可以作为使用注意事项提醒用户。 最后,根据系统指令,需要生成相关问题。应该围绕@Id的关联注解、生成策略、不同ORM框架中的差异以及常见错误来设计问题,这样能帮助用户进一步深入学习。 现在需要检查是否有遗漏的点,比如是否提到了复合主键的情况,或者是否需要介绍@EmbeddedId等其他相关注解。不过根据用户的问题,主要关注@Id本身,可能不需要深入复合主键,但可以在相关问题中提到,让用户有进一步探索的方向。 确保回答结构清晰,分点说明,并且代码示例正确,符合中文回答的要求。同时引用部分可能没有直接相关的,但根据用户提供的引用,他们可能之前接触过其他注解如@Validated、@Builder等,但这次需要专注于@Id,所以引用部分可能不需要直接使用,但需要确保回答内容准确可靠。</think>### Java @Id 注解的用法与含义 #### 1. **基本定义** - **@Id 注解**用于标识实体类(Entity Class)的主键字段,是 JPA(Java Persistence API)规范中的核心注解[^1]。 - 主键是数据库表中唯一标识一条记录的字段,`@Id` 通过注解实体类的属性或方法,将其映射到数据库表的主键列。 --- #### 2. **核心功能** - **标识主键**:标记实体类中对应数据库表主键的属性。 - **支持主键生成策略**:通常与 `@GeneratedValue` 注解结合使用,定义主键的生成方式(如自增、UUID 等)。 --- #### 3. **使用示例** ```java import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // 省略 getter 和 setter } ``` - **代码说明**: - `@Id` 标注 `id` 字段为主键。 - `@GeneratedValue(strategy = GenerationType.IDENTITY)` 表示主键由数据库自动生成(如 MySQL 的 `AUTO_INCREMENT`)。 --- #### 4. **主键生成策略** 通过 `@GeneratedValue` 的 `strategy` 参数指定主键生成方式: | 策略类型 | 说明 | |-------------------------|----------------------------------------------------------------------| | `GenerationType.IDENTITY` | 依赖数据库的自增字段(如 MySQL、SQL Server) | | `GenerationType.SEQUENCE` | 使用数据库序列(如 Oracle),需配合 `@SequenceGenerator` 使用 | | `GenerationType.TABLE` | 通过中间表模拟序列,灵活性高但性能较低 | | `GenerationType.AUTO` | 由 JPA 自动选择适合的生成策略(默认选项) | --- #### 5. **注意事项** 1. **必须与 `@Entity` 配合**:`@Id` 仅在 JPA 实体类中生效。 2. **字段类型匹配**:主键类型需与数据库字段类型兼容(如 `Long` 对应 `BIGINT`)。 3. **复合主键**:若需多个字段联合为主键,需使用 `@IdClass` 或 `@EmbeddedId` 注解。 4. **无参构造方法**:实体类必须提供无参构造方法,否则可能引发持久化异常。 --- #### 6. **常见问题场景** - **错误示例**:未添加 `@GeneratedValue` 导致插入数据时主键为空。 - **解决方案**:显式指定主键生成策略或手动赋值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值