Spring Data JPA 是基于 JPA(Java Persistence API)规范构建的,而 JPA 提供了一组注解来帮助开发者定义实体类与数据库表之间的映射关系。以下是 JPA 中一些常用的基本注解及其用途:
常用 JPA 注解
-
@Entity
- 用于标记一个 Java 类作为 JPA 的实体类。
- 例子:
@Entity public class User { // ... }
-
@Table
- 用于指定实体类所对应的数据库表名。
- 例子:
@Entity @Table(name = "users") public class User { // ... }
-
@Id
- 标记实体类中的某个属性作为主键。
- 例子:
@Entity public class User { @Id private Long id; // ... }
-
@GeneratedValue
- 用于指定主键的生成策略。
- 例子:
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // ... }
- 生成策略:
- IDENTITY: 数据库自增(如 MySQL 的 AUTO_INCREMENT)。
- AUTO: 由持久化提供者决定(Hibernate 默认使用此策略)。
- SEQUENCE: 使用数据库序列。
- TABLE: 使用一个特定的表来存储主键值。
-
@Column
- 用于指定实体类属性和数据库表列之间的映射关系。
- 例子:
@Entity public class User { @Id private Long id; @Column(name = "user_name", nullable = false) private String username; // ... }
-
@ManyToOne / @OneToMany / @OneToOne / @ManyToMany
- 用于定义实体之间的关联关系。
- 例子:
@Entity public class User { @Id private Long id; @ManyToOne @JoinColumn(name = "address_id") private Address address; // ... } @Entity public class Address { @Id private Long id; private String street; // ... }
-
@Temporal
- 用于指定日期/时间类型的属性应如何被存储。
- 例子:
@Entity public class User { @Id private Long id; @Temporal(TemporalType.TIMESTAMP) private Date lastLogin; // ... }
-
@Lob
- 用于指定大对象(Large Object)类型的数据,例如 BLOB 或 CLOB。
- 例子:
@Entity public class Document { @Id private Long id; @Lob private byte[] content; // ... }
-
@Transient
- 用于标记不应该被持久化的属性。
- 例子:
@Entity public class User { @Id private Long id; @Transient private String fullName; // ... }
-
@PrePersist / @PreUpdate
- 用于定义实体在持久化之前或更新之前要执行的操作。
- 例子:
@Entity public class User { @Id private Long id; private Date createdAt; private Date updatedAt; @PrePersist protected void onCreate() { createdAt = new Date(); updatedAt = new Date(); } @PreUpdate protected void onUpdate() { updatedAt = new Date(); } // ... }
示例代码
让我们来看一个具体的示例,定义一个简单的用户实体类 User
和地址实体类 Address
,并且它们之间有一对多的关系:
import javax.persistence.*;
import java.util.Date;
import java.util.Set;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Temporal(TemporalType.TIMESTAMP)
private Date lastLogin;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Address> addresses;
// 构造函数、getters 和 setters
}
@Entity
@Table(name = "addresses")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "street", nullable = false)
private String street;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
// 构造函数、getters 和 setters
}
以上就是 JPA 中一些基本注解的介绍及示例。当你在项目中使用这些注解时,Spring Data JPA 会根据这些注解自动为你生成数据访问逻辑,从而极大地减少了模板代码的编写量。如果你需要更详细的解释或者有其他具体问题,请随时告诉我!