写点什么

32 个 Spring JPA 注解:提供全面的 JPA 注解应用案例 (必须收藏)

作者:肖哥弹架构
  • 2024-08-23
    河北
  • 本文字数:8290 字

    阅读完需:约 27 分钟

32个Spring  JPA注解:提供全面的JPA注解应用案例(必须收藏)

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 实体,表明此类可以映射到数据库的一张表上。


  • 注解属性介绍

  • name: 指定实体的名称,若未指定,默认使用类名。

  • 注解业务案例


@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 指定主键的生成策略。


  • 注解属性介绍

  • strategy: 指定生成策略,如 GenerationType.IDENTITYGenerationType.AUTO 等。

  • 注解业务案例


@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 指定枚举类型的存储方式。


  • 注解属性介绍

  • value: 指定枚举的存储类型,如 EnumType.ORDINAL 或 EnumType.STRING

  • 注解业务案例


public enum Status {    ACTIVE, INACTIVE}
public class User { @Column(nullable = false) @Enumerated(EnumType.STRING) private Status status;}
复制代码

4. 嵌入类型

@Embedded

  • 注解作用介绍


@Embedded 用于将一个类的属性嵌入到另一个实体类中。


  • 注解属性介绍

  • id: 指定嵌入类的 ID。

  • 注解业务案例


@Embeddablepublic class Address {    private String street;    private String city;}
public class User { @Embedded private Address address;}
复制代码

5. 关联关系映射

@ManyToOne

  • 注解作用介绍


@ManyToOne 用于标记一个实体与另一个实体存在“多对一”的关联关系。


  • 注解属性介绍

  • targetEntity: 指定关联实体的类型。

  • fetch: 指定加载策略,如 FetchType.LAZY 或 FetchType.EAGER

  • optional: 指定是否允许为空,默认为 true

  • 注解业务案例


@Entitypublic class OrderItem {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order;
// 其他属性和方法}
复制代码

@OneToMany

  • 注解作用介绍


@OneToMany 用于标记一个实体与另一个实体存在“一对多”的关联关系。


  • 注解属性介绍

  • targetEntity: 指定关联实体的类型。

  • mappedBy: 指定对方实体中用来映射当前实体的属性名。

  • cascade: 指定级联操作,如 CascadeType.ALL

  • 注解业务案例


@Entitypublic 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 用于标记一个实体与另一个实体存在“一对一”的关联关系。


  • 注解属性介绍

  • targetEntity: 指定关联实体的类型。

  • mappedBy: 指定对方实体中用来映射当前实体的属性名。

  • cascade: 指定级联操作。

  • 注解业务案例


@Entitypublic class UserDetails {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;
@OneToOne(mappedBy = "details", cascade = CascadeType.ALL) private User user;
// 其他属性和方法}
@Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "user_details_id") private UserDetails details;
// 其他属性和方法}
复制代码

@ManyToMany

  • 注解作用介绍


@ManyToMany 用于标记一个实体与另一个实体存在“多对多”的关联关系。


  • 注解属性介绍

  • targetEntity: 指定关联实体的类型。

  • mappedBy: 指定对方实体中用来映射当前实体的属性名。

  • cascade: 指定级联操作。

  • fetch: 指定加载策略。

  • 注解业务案例


@Entitypublic 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<>();
// 其他属性和方法}
@Entitypublic class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) private Set<User> users = new HashSet<>();
// 其他属性和方法}
复制代码

@JoinColumn

  • 注解作用介绍


@JoinColumn 用于指定关联关系中的外键列名。


  • 注解属性介绍

  • name: 指定外键列的名称。

  • referencedColumnName: 指定引用的主键列的名称。

  • 注解业务案例


public class OrderItem {    @ManyToOne    @JoinColumn(name = "order_id", referencedColumnName = "id")    private Order order;}
复制代码

6. 生命周期和行为

@Basic

  • 注解作用介绍


@Basic 标记基本属性,可以指定加载策略等。


  • 注解属性介绍

  • fetch: 指定加载策略,如 FetchType.LAZY 或 FetchType.EAGER

  • 注解业务案例


public class User {    @Basic(fetch = FetchType.LAZY)    private String description;}
复制代码

@Transient

  • 注解作用介绍


@Transient 标记不映射到数据库表的属性。


  • 注解属性介绍


无特定属性。


  • 注解业务案例


public class User {    @Transient    private String temporaryField;}
复制代码

7. 主键生成策略

@SequenceGenerator

  • 注解作用介绍


@SequenceGenerator 用于指定一个主键生成策略,基于数据库序列。


  • 注解属性介绍

  • name: 唯一标识主键生成器的名称。

  • sequenceName: 数据库中序列的名称。

  • initialValue: 生成主键的起始值。

  • allocationSize: 每次从数据库序列中预分配的 ID 数量。

  • 注解业务案例


@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 用于指定一个方法的结果是可缓存的。


  • 注解属性介绍

  • value: 缓存名称,用于存储结果。

  • condition: 缓存条件,使用 SpEL 表达式。

  • 注解业务案例


@Cacheable(value = "userList", condition = "#root.args[0] == 1")public List<User> getUsersByStatus(Integer status) {    // 查询逻辑}
复制代码

9. 事务管理

@Transactional

  • 注解作用介绍


@Transactional 用于声明事务性方法,确保方法在事务的上下文中执行。


  • 注解属性介绍

  • propagation: 事务传播行为。

  • isolation: 事务隔离级别。

  • timeout: 事务超时时间。

  • readOnly: 指示事务是否为只读。

  • rollbackFor: 定义在哪些异常下事务应该回滚。

  • 注解业务案例


@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 用于在实体类级别指定一个额外的查询条件,作为所有查询方法的默认条件。


  • 注解属性介绍

  • 通常与 clause 属性一起使用,指定要添加的条件语句。

  • 注解业务案例


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;
@Repositorypublic interface UserRepository extends JpaRepository<User, Long> { List<User> findByUsernameContaining(String username);}
@Repositorypublic 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;
@Servicepublic 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;
@Componentpublic class UserRegistrationListener { @EventListener public void onUserRegistration(UserRegisteredEvent event) { User user = event.getUser(); // 处理用户注册事件逻辑 }}
// 自定义注解 @Auditableimport 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;
@SpringBootApplicationpublic class ECommerceApplication {
public static void main(String[] args) { SpringApplication.run(ECommerceApplication.class, args); }}
复制代码


发布于: 刚刚阅读数: 3
用户头像

智慧属心窍之锁 2019-05-27 加入

擅长于通信协议、微服务架构、框架设计、消息队列、服务治理、PAAS、SAAS、ACE\ACP、大模型

评论

发布
暂无评论
32个Spring  JPA注解:提供全面的JPA注解应用案例(必须收藏)_Java_肖哥弹架构_InfoQ写作社区