Spring JPA 提供了一系列注解,用于简化数据库操作和实现 ORM 功能。以下是 Spring JPA 中一些核心注解的引用:
@Entity
: 标识类为 JPA 实体,映射到数据库表。
@Table
: 指定实体对应的数据库表名。
@Id
: 标记实体的主键字段。
@GeneratedValue
: 定义主键的生成策略。
@Column
: 定义实体属性与数据库列的映射。
@Basic
: 描述基本的持久属性。
@ManyToOne
, @OneToMany
, @OneToOne
, @ManyToMany
: 描述实体间的关联关系。
@JoinColumn
: 用于关联字段的外键映射。
@Transient
: 标识不持久化的属性。
@Embeddable
: 标记可嵌入的属性或对象。
@Embedded
: 将一个类作为另一个类的属性嵌入。
@Cacheable
: 指定方法结果是可缓存的。
@Transactional
: 声明事务性方法。这些注解共同构成了 Spring Data JPA 的基础,提供了一种声明式的方式来处理数据持久化,极大地提高了开发效率。
肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注
欢迎 点赞,关注,评论。
关注公号 Solomon 肖哥弹架构获取更多精彩内容
历史热点文章
1. 实体定义
@Entity
@Entity
标记类作为 JPA 实体,表明此类可以映射到数据库的一张表上。
@Entity(name = "user_entity")
public class User {
// 类成员
}
复制代码
@Table
@Table
用于指定实体类对应的数据库表名。
注解属性介绍
name
: 指定表名。
schema
: 指定数据库的 schema。
catalog
: 指定数据库的 catalog。
注解业务案例
@Entity
@Table(name = "users", schema = "my_schema", catalog = "my_catalog")
public class User {
// 类成员
}
复制代码
2. 主键定义
@Id
@Id
标记实体类中的属性作为主键。
无特定属性。
public class User {
@Id
private Long id;
// 其他成员
}
复制代码
@GeneratedValue
@GeneratedValue
指定主键的生成策略。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
复制代码
3. 属性映射
@Column
@Column
用于指定实体属性与数据库表列的映射关系。
注解属性介绍
name
: 指定数据库表的列名。
nullable
: 指定列是否允许为空。
注解业务案例
public class User {
@Column(name = "username", nullable = false)
private String username;
}
复制代码
@Enumerated
@Enumerated
指定枚举类型的存储方式。
public enum Status {
ACTIVE, INACTIVE
}
public class User {
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private Status status;
}
复制代码
4. 嵌入类型
@Embedded
@Embedded
用于将一个类的属性嵌入到另一个实体类中。
注解属性介绍
id
: 指定嵌入类的 ID。
注解业务案例
@Embeddable
public class Address {
private String street;
private String city;
}
public class User {
@Embedded
private Address address;
}
复制代码
5. 关联关系映射
@ManyToOne
@ManyToOne
用于标记一个实体与另一个实体存在“多对一”的关联关系。
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order;
// 其他属性和方法
}
复制代码
@OneToMany
@OneToMany
用于标记一个实体与另一个实体存在“一对多”的关联关系。
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderItem> items = new ArrayList<>();
// 其他属性和方法
}
复制代码
@OneToOne
@OneToOne
用于标记一个实体与另一个实体存在“一对一”的关联关系。
@Entity
public class UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy = "details", cascade = CascadeType.ALL)
private User user;
// 其他属性和方法
}
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_details_id")
private UserDetails details;
// 其他属性和方法
}
复制代码
@ManyToMany
@ManyToMany
用于标记一个实体与另一个实体存在“多对多”的关联关系。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
// 其他属性和方法
}
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
private Set<User> users = new HashSet<>();
// 其他属性和方法
}
复制代码
@JoinColumn
@JoinColumn
用于指定关联关系中的外键列名。
public class OrderItem {
@ManyToOne
@JoinColumn(name = "order_id", referencedColumnName = "id")
private Order order;
}
复制代码
6. 生命周期和行为
@Basic
@Basic
标记基本属性,可以指定加载策略等。
public class User {
@Basic(fetch = FetchType.LAZY)
private String description;
}
复制代码
@Transient
@Transient
标记不映射到数据库表的属性。
无特定属性。
public class User {
@Transient
private String temporaryField;
}
复制代码
7. 主键生成策略
@SequenceGenerator
@SequenceGenerator
用于指定一个主键生成策略,基于数据库序列。
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "user_sequence_generator"
)
@SequenceGenerator(
name = "user_sequence_generator",
sequenceName = "user_sequence",
initialValue = 1,
allocationSize = 1
)
private Long id;
复制代码
@TableGenerator
@TableGenerator
用于指定一个主键生成策略,基于数据库表。
注解属性介绍
name
: 唯一标识主键生成器的名称。
table
: 存储主键值的表名。
pkColumnValue
: 表中用于跟踪高水位的列值。
valueColumn
: 存储生成的主键值的列名。
allocationSize
: 每次从表中预分配的 ID 数量。
注解业务案例
@Id
@GeneratedValue(
strategy = GenerationType.TABLE,
generator = "user_table_generator"
)
@TableGenerator(
name = "user_table_generator",
table = "sequence_table",
pkColumnValue = "user",
valueColumn = "sequence_value",
allocationSize = 10
)
private Long id;
复制代码
8. 查询和缓存
@NamedQuery
@NamedQuery
用于定义一个命名查询,可以是 HQL、JPQL 或 SQL 查询。
注解属性介绍
name
: 查询的名称,用于在应用程序中引用。
query
: 查询的字符串。
注解业务案例
@NamedQuery(
name = "User.findAllActive",
query = "SELECT u FROM User u WHERE u.status = 'ACTIVE'"
)
public class User {
// 类成员
}
复制代码
@NamedQueries
@NamedQueries
用于定义多个命名查询的集合。
注解属性介绍
包含多个 @NamedQuery
注解。
注解业务案例
@NamedQueries({
@NamedQuery(
name = "User.findAll",
query = "SELECT u FROM User u"
),
@NamedQuery(
name = "User.findActive",
query = "SELECT u FROM User u WHERE u.status = 'ACTIVE'"
)
})
public class User {
// 类成员
}
复制代码
@Cacheable
@Cacheable
用于指定一个方法的结果是可缓存的。
@Cacheable(value = "userList", condition = "#root.args[0] == 1")
public List<User> getUsersByStatus(Integer status) {
// 查询逻辑
}
复制代码
9. 事务管理
@Transactional
@Transactional
用于声明事务性方法,确保方法在事务的上下文中执行。
@Transactional(readOnly = false, rollbackFor = Exception.class)
public void updateUser(User user) {
// 更新用户信息的逻辑
}
复制代码
10. 事件监听
@EntityListeners
@EntityListeners
用于指定一个或多个类作为实体的事件监听器。
@EntityListeners({AuditListener.class, AnotherListener.class})
public class AuditableEntity {
// 实体成员
}
复制代码
@PrePersist
@PrePersist
用于标记在实体持久化(插入)前执行的方法。
无特定属性。
public class User {
@PrePersist
public void onPrePersist() {
// 持久化前的逻辑
}
}
复制代码
@PostPersist
@PostPersist
用于标记在实体持久化(插入)后执行的方法。
无特定属性。
public class User {
@PostPersist
public void onPostPersist() {
// 持久化后的逻辑
}
}
复制代码
@PreUpdate
@PreUpdate
用于标记在实体更新前执行的方法。
无特定属性。
public class User {
@PreUpdate
public void onPreUpdate() {
// 更新前的逻辑
}
}
复制代码
@PostUpdate
@PostUpdate
用于标记在实体更新后执行的方法。
无特定属性。
public class User {
@PostUpdate
public void onPostUpdate() {
// 更新后的逻辑
}
}
复制代码
@PreRemove
@PreRemove
用于标记在实体删除前执行的方法。
无特定属性。
public class User {
@PreRemove
public void onPreRemove() {
// 删除前的逻辑
}
}
复制代码
@PostRemove
@PostRemove
用于标记在实体删除后执行的方法。
无特定属性。
public class User {
@PostRemove
public void onPostRemove() {
// 删除后的逻辑
}
}
复制代码
11. 高级映射
@AttributeOverride
@AttributeOverride
用于覆盖继承自父类的属性映射。
注解属性介绍
name
: 指定要覆盖的属性名称。
column
: 指定新的列映射。
注解业务案例
public class BaseEntity {
@Column(name = "base_id")
protected Long id;
}
public class User extends BaseEntity {
@AttributeOverride(name = "id", column = @Column(name = "user_id"))
protected Long id;
}
复制代码
@AssociationOverride
@AssociationOverride
用于覆盖继承自父类的关联属性映射。
注解属性介绍
name
: 指定要覆盖的关联属性名称。
joinColumns
: 指定新的关联列映射。
注解业务案例
public class BaseEntity {
@ManyToOne
protected Department department;
}
public class User extends BaseEntity {
@AssociationOverride(
name = "department",
joinColumns = @JoinColumn(name = "user_department_id")
)
protected Department department;
}
复制代码
@SqlResultSetMapping
@SqlResultSetMapping
用于定义 SQL 查询结果与 Java 类型之间的映射。
注解属性介绍
name
: 指定结果集映射的名称。
classes
: 指定结果集映射的类。
columns
: 指定结果集中列的名称。
注解业务案例
@EntityResultMapping(
name = "UserDetails",
classes = User.class,
columns = {
@ColumnResult(name = "id", type = Long.class),
@ColumnResult(name = "username", type = String.class)
}
)
public class User {
//类成员
}
复制代码
12. 条件查询
@Where
@Where
用于在实体类级别指定一个额外的查询条件,作为所有查询方法的默认条件。
public class User {
@Where(clause = "status = 'ACTIVE'")
@OneToMany(mappedBy = "user")
private List<Post> posts;
}
复制代码
13. 所有注解综合案例
1. 数据库表结构
定义数据库中的表结构:
-- 用户表
CREATE TABLE User (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 订单表
CREATE TABLE Order (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
total DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES User(id)
);
-- 订单项表
CREATE TABLE OrderItem (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT NOT NULL,
product_name VARCHAR(255) NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES Order(id)
);
复制代码
2. 实体定义与映射
定义 Java 实体和对应的 JPA 注解。
User 实体
import javax.persistence.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Entity
@Table(name = "User")
@EntityListeners(AuditingEntityListener.class) // 用于添加创建和更新时间戳
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false, unique = true)
private String email;
@CreatedDate
private Date createdAt;
@PrePersist
private void onPrePersist() {
email = email.toLowerCase();
}
// Getters and Setters
}
复制代码
Order 实体
import javax.persistence.*;
import java.util.List;
@Entity
@Table(name = "Order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
@Column(nullable = false)
private double total;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List<OrderItem> items;
// Getters, Setters, and other methods
}
复制代码
OrderItem 实体
import javax.persistence.*;
@Entity
@Table(name = "OrderItem")
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id", nullable = false)
private Order order;
@Column(nullable = false)
private String productName;
@Column(nullable = false)
private int quantity;
@Column(nullable = false)
private double price;
// Getters and Setters
}
复制代码
3. 仓库定义
定义 Spring Data JPA 仓库接口。
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByUsernameContaining(String username);
}
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
List<Order> findByUserId(Long userId);
}
复制代码
4. 服务层定义
定义服务层,使用@Transactional
注解管理事务。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Transactional
public Order createOrder(User user, List<OrderItem> items) {
Order order = new Order();
order.setUser(user);
order.setItems(items);
// 计算总价格等逻辑
return orderRepository.save(order);
}
}
复制代码
5. 事件监听与自定义注解
定义事件监听器和自定义注解@Auditable
。
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class UserRegistrationListener {
@EventListener
public void onUserRegistration(UserRegisteredEvent event) {
User user = event.getUser();
// 处理用户注册事件逻辑
}
}
// 自定义注解 @Auditable
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Auditable {
}
复制代码
6. 应用程序启动类
最后,定义 Spring Boot 应用程序的启动类。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ECommerceApplication {
public static void main(String[] args) {
SpringApplication.run(ECommerceApplication.class, args);
}
}
复制代码
评论