网站首页 > 精选文章 / 正文
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.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。
- 注解业务案例
@Embeddable
public 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。
- 注解业务案例
@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.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;
@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注解