MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

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

2024-12-09 13:01 huorong 精选文章 11 ℃ 0 评论

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肖哥弹架构获取更多精彩内容

历史热点文章

  • 28个验证注解,通过业务案例让你精通Java数据校验(收藏篇)
  • Java 8函数式编程全攻略:43种函数式业务代码实战案例解析(收藏版)
  • 69 个Spring mvc 全部注解:真实业务使用案例说明(必须收藏)
  • 24 个Spring bean 全部注解:真实业务使用案例说明(必须收藏)
  • MySQL索引完全手册:真实业务图文讲解17种索引运用技巧(必须收藏)
  • 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO

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.IDENTITY, GenerationType.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.ORDINALEnumType.STRING
  • 注解业务案例
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 用于标记一个实体与另一个实体存在“多对一”的关联关系。

  • 注解属性介绍targetEntity: 指定关联实体的类型。fetch: 指定加载策略,如 FetchType.LAZYFetchType.EAGERoptional: 指定是否允许为空,默认为 true
  • 注解业务案例
@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 用于标记一个实体与另一个实体存在“一对多”的关联关系。

  • 注解属性介绍targetEntity: 指定关联实体的类型。mappedBy: 指定对方实体中用来映射当前实体的属性名。cascade: 指定级联操作,如 CascadeType.ALL
  • 注解业务案例
@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 用于标记一个实体与另一个实体存在“一对一”的关联关系。

  • 注解属性介绍targetEntity: 指定关联实体的类型。mappedBy: 指定对方实体中用来映射当前实体的属性名。cascade: 指定级联操作。
  • 注解业务案例
@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 用于标记一个实体与另一个实体存在“多对多”的关联关系。

  • 注解属性介绍targetEntity: 指定关联实体的类型。mappedBy: 指定对方实体中用来映射当前实体的属性名。cascade: 指定级联操作。fetch: 指定加载策略。
  • 注解业务案例
@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 用于指定关联关系中的外键列名。

  • 注解属性介绍name: 指定外键列的名称。referencedColumnName: 指定引用的主键列的名称。
  • 注解业务案例
public class OrderItem {
    @ManyToOne
    @JoinColumn(name = "order_id", referencedColumnName = "id")
    private Order order;
}

6. 生命周期和行为

@Basic

  • 注解作用介绍

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

  • 注解属性介绍fetch: 指定加载策略,如 FetchType.LAZYFetchType.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;

@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);
    }
}

Tags:generatedvalue注解

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言