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。
注解业务案例
@Embeddablepublic class Address { private String street; private String city;}
public class User { @Embedded private Address address;}
复制代码
5. 关联关系映射
@ManyToOne
@ManyToOne 用于标记一个实体与另一个实体存在“多对一”的关联关系。
@Entitypublic class OrderItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order;
// 其他属性和方法}
复制代码
@OneToMany
@OneToMany 用于标记一个实体与另一个实体存在“一对多”的关联关系。
@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 用于标记一个实体与另一个实体存在“一对一”的关联关系。
@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 用于标记一个实体与另一个实体存在“多对多”的关联关系。
@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 用于指定关联关系中的外键列名。
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;
@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); }}
复制代码
评论