0Pricing
Java Academy · 课时

使用 JPA 注解映射实体

定义 @Entity、@Table、@Id、@GeneratedValue、@Column 和 @Embedded,实现清晰的实体设计

使用 JPA 注解映射实体 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

什么是 JPA 实体映射

JPA(Jakarta Persistence API)使用注解将 Java 类映射到数据库表。Hibernate 是最常用的 JPA 提供程序。无需编写 SQL DDL——JPA 会根据注解生成架构。

@Entity 和 @Table

@Entity 将类标记为 JPA 实体。@Table 用于自定义表名、架构和唯一性约束。每个实体都必须有一个无参数构造器(可以是 protected)。

@Entity
@Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {
    // ...
    protected User() {} // required by JPA
}

@Id 和 @GeneratedValue

@Id 用于标记主键字段。@GeneratedValue 用于配置自动生成策略:IDENTITY(数据库自增)、SEQUENCE(数据库序列,更适合批量插入)或 AUTO。

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

@Column:自定义列

@Column 用于设置列名、长度、可空性和唯一性。如果不使用该注解,字段名就会成为列名。

@Column(name = "full_name", nullable = false, length = 100)
private String name;
@Column(name = "email", unique = true, nullable = false)
private String email;
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;

@Embedded 和 @Embeddable

请将一组列提取为可复用的值对象,并使用 @Embeddable 注解。然后在实体中使用 @Embedded 来包含其字段。

@Embeddable
public class Address {
    private String street, city, country;
    @Column(name = "zip_code") private String zipCode;
}
@Entity
public class User {
    @Embedded private Address address;
}

@Enumerated:持久化枚举

可以将枚举持久化为其名称字符串(STRING)或序号整数(ORDINAL)。请始终使用 STRING——枚举值重新排序时,序号会失效。

@Enumerated(EnumType.STRING)
@Column(nullable = false)
private UserStatus status; // stored as "ACTIVE", "INACTIVE", etc.

@CreationTimestamp 和 @UpdateTimestamp

这些是 Hibernate 特有的注解,会分别在插入和更新时自动设置时间戳——无需手动使用 @PrePersist。

@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdAt;
@UpdateTimestamp
private LocalDateTime updatedAt;

@Transient:排除字段

使用 @Transient 注解的字段不会被持久化。请将它用于不应存储在数据库中的派生字段或计算字段。

@Transient
public String getFullName() { return firstName + " " + lastName; }

@Lob:大对象

请使用 @Lob 将大型文本(TEXT/CLOB)或二进制数据(BLOB)映射到数据库列。PostgreSQL 会将 @Lob String 映射为 TEXT。

@Lob
@Column(name = "content")
private String content; // maps to TEXT in PostgreSQL

equals 和 hashCode 契约

集合中的 JPA 实体必须根据业务键(而不是生成的 ID;持久化前 ID 为 null)实现 equals / hashCode。请使用 @NaturalId 或 UUID 替代主键。

@Override public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof User u)) return false;
    return email != null && email.equals(u.email);
}
@Override public int hashCode() { return getClass().hashCode(); }

使用 @Version 实现乐观锁

请添加一个 @Version 字段。Hibernate 会在每次更新时递增它。如果两个事务同时更新同一行,后一个事务会抛出 OptimisticLockException。

@Version
private Long version; // auto-managed by Hibernate

快速检查

为什么 @Enumerated 应该使用 STRING 而不是 ORDINAL?

回顾

使用 @Entity/@Table 实现类到表的映射。使用 @Id+@GeneratedValue 配置主键。使用 @Column 设置约束。使用 @Embedded 表示值对象。始终使用 @Enumerated(STRING)。添加 @Version 实现乐观锁。

常见问题解答

「使用 JPA 注解映射实体」课时是免费的吗?

是的 — 「使用 JPA 注解映射实体」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「使用 JPA 注解映射实体」这节课中我会学到什么?

定义 @Entity、@Table、@Id、@GeneratedValue、@Column 和 @Embedded,实现清晰的实体设计 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「使用 JPA 注解映射实体」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 JPA 注解映射实体
  2. Spring Data 仓库与查询方法
  3. 一对多与多对多关系
  4. 分页、排序与投影
← 返回 Java Academy