成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

強大!Spring Boot + JPA 實體類設計五大實戰技巧

開發 項目管理
本篇文章我們將深入探討基于Spring Boot項目開發時,如何利用JPA設計實體類的重要最佳實踐。通過遵循這些最佳實踐,開發人員可以確保應用程序的完整性、性能和可擴展性。

環境:SpringBoot3.4.2

1. 簡介

項目開發中,實體類的有效設計和實現對于構建健壯且易于維護的應用程序至關重要。JPA與Spring Boot的強大功能相結合,使開發人員能夠簡化數據庫操作并創建高度功能化的應用程序。

本篇文章我們將深入探討基于Spring Boot項目開發時,如何利用JPA設計實體類的重要最佳實踐。通過遵循這些最佳實踐,開發人員可以確保應用程序的完整性、性能和可擴展性。

2. 最佳實踐

2.1 實體類與繼承

  • 使用@Entity注解來標記您的實體類,以表明它們是JPA實體
  • 如果表名與類名不同,請使用@Table注解來指定表名
  • 對于應由多個實體繼承的公共屬性,可以考慮使用@MappedSuperclass

實體類基類設計

@MappedSuperclass
public abstract class BaseEntity implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  // 其它公共屬性
  @Temporal(TemporalType.TIMESTAMP)
  private Date createTime ;
  //getters, setters
}

BaseEntity類被注解為@MappedSuperclass。它包含了你希望在多個實體類之間共享的公共字段。Employee類繼承自BaseEntity,也就從超類繼承了id, createTime字段。通過基類的設計實現了代碼的復用性,并保持了實體層次的清晰和結構化。

具體實體類

@Entity
@Table(name = "t_employees")
public class Employee extends BaseEntity {
  
  private String name ;
  private String address ;
  // getters, setters
}

主鍵說明

  • 主鍵字段使用@Id注解
  • 主鍵生成策略使用@GeneratedValue注解(該注解有多種生成策略,如:GenerationType.IDENTITY、GenerationType.SEQUENCE等)

關聯關系

  • 使用@OneToOne、@OneToMany、@ManyToOne和@ManyToMany來定義實體之間的關系
  • 使用fetch屬性來控制加載行為(例如,LAZY(延遲加載)或EAGER(急切加載))
  • 利用mappedBy來定義雙向關聯中的擁有方
@Entity
@Table(name = "t_department")
public class Department extends BaseEntity {
  private String name;
  private String code ;
  @OneToMany(mappedBy = "department")
  private List<Employee> employees = new ArrayList<>() ;
  // getters, setters
}
@Entity
@Table(name = "t_employee")
public class Employee extends BaseEntity {
  // ...
  @ManyToOne
  @JoinColumn(name = "department_id")
  private Department department;
  // getters, setters
}

級聯操作

  • 使用cascade屬性來指定級聯操作(例如,CascadeType.ALL、CascadeType.PERSIST)
  • 在使用級聯刪除(CascadeType.DELETE)時要特別小心,以避免意外丟失數據
     
public class Department extends BaseEntity {
  // ...
  @OneToMany(mappedBy = "department", 
    cascade = {
      CascadeType.REFRESH, 
      CascadeType.PERSIST, 
      CascadeType.REMOVE
    },
    orphanRemoval = true
  )
  private List<Employee> employees = new ArrayList<>() ;
}

說明:

  • 如果你將級聯操作設置為CascadeType.ALL,所有操作(例如,持久化、合并、刪除)都應該從父實體(Department)級聯到子實體(Employee)
  • orphanRemoval = true:此選項指定當從Department集合中移除對某個Employee實體的引用時,這個孤立的Employee實體也應該從數據庫中刪除

如下示例,保存Department時會級聯保存所有的Employee。

@Resource
private DepartmentRepository departmentRepository ;
@Test
public void testSave() {
  Department department = new Department() ;
  department.setCode("S0001") ;
  department.setName("研發部") ;
  Employee e1 = new Employee("張三", "SC") ;
  e1.setDepartment(department) ;
  Employee e2 = new Employee("Pack", "XJ") ;
  e2.setDepartment(department) ;
  department.setEmployees(List.of(e1, e2)) ;
    
  this.departmentRepository.saveAndFlush(department) ;
}

控制臺輸出

同樣也適用于其它的級聯操作。

2.2 有效性驗證

  • 使用驗證注解(如@NotNull、@Size等)直接在實體類中強制實施數據完整性約束。
  • 將JPA驗證與Spring的@Valid注解結合使用,以自動驗證傳入的數據。
@Entity
@Table(name = "t_department")
public class Department extends BaseEntity {
  @NotEmpty(message = "部門名稱不能為空")
  @Length(min = 2)
  private String name;
  @NotEmpty(message = "部門代碼不能為空")
  private String code ;
}

當我們執行如下代碼時程序將拋出異常

@Test
public void testSave() {
  Department department = new Department() ;
  department.setCode("S0001") ;
  // 沒有設置name屬性
  this.departmentRepository.saveAndFlush(department) ;
}

注意,你需要開啟如下配置:

spring:
  jpa:
    properties:
      hibernate:
        '[javax.persistence.validation.mode]': auto

2.3 審計

  • 通過添加如@CreatedBy、@CreatedDate、@LastModifiedBy和@LastModifiedDate等字段來實現實體審計,以跟蹤是哪個用戶何時創建或修改了實體
  • 利用Spring的@EntityListeners來管理審計行為

如下比較完善的一個實體基類

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditableEntity implements Serializable {
  private static final long serialVersionUID = 1L;
  
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id ;
  @Temporal(TemporalType.TIMESTAMP)
  private Date createTime = new Date() ;
  @CreatedBy
  protected String createdBy;
  @CreatedDate
  @Column(nullable = false, updatable = false)
  protected LocalDateTime createdDate;
  @LastModifiedBy
  protected String lastModifiedBy;
  @LastModifiedDate
  protected LocalDateTime lastModifiedDate;
}

如上我們又定義了一個可以審計的實體基類;如果哪個實體需要被審計那么就繼承該類即可。

@Entity
@Table(name = "t_product")
public class Product extends AuditableEntity {


  private String name;
  private Double price;
  // getters, setters
}

注意,要使得審計功能生效,我們還需要做如下配置:

開啟審計功能。

@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

當前審計人Bean。

我們需要提供一個你當前操作的人是誰的bean。

@Component
public class SystemAuditorAware implements AuditorAware<String> {
  @Override
  public Optional<String> getCurrentAuditor() {
    return Optional.of("Pack") ;
  }
}

這里你需要根據自己的實際情況來編寫。

2.4 DTO映射

  • 當查詢數據時,考慮使用DTO投影來僅查詢需要的字段,從而提高性能
  • 使用Spring Data JPA的@Query注解或查詢方法來創建自定義投影

如下實體類

@Entity
@Table(name = "t_author")
public class Author extends BaseEntity {
  private String name ;
  private Integer age ;
  private String address ;
  private String sex ;
  private String email ;
}

該實體字段表多,我們可能只需要部分字段,如:name,sex,那么我們可以定義如下的投影:

public interface AuthorProjection {
  
  String getName();
  String getSex();
}

使用@Query查詢

public interface AuthorRepository extends JpaRepository<Author, Long> {


  @Query("select e.name as name, e.sex as sex from Author e")
  List<AuthorProjection> queryAuthors() ;
}

注意,你需要在sql中使用 as 別名。

2.5 索引

在實體類上我們可以通過@Table注解的indexes屬性指定列來創建索引。

@Entity
@Table(name = "t_author", indexes = {
    @Index(columnList = "name, sex")
})
public class Author extends BaseEntity {}

當服務啟動時,會自動創建基于 "name", "sex" 2個字段的聯合索引。

索引對于提高查詢性能至關重要,尤其是在處理大型數據集時。根據你應用程序的查詢模式,仔細選擇哪些列要創建索引是非常關鍵的。

責任編輯:武曉燕 來源: Springboot實戰案例源碼
相關推薦

2024-11-19 15:22:37

2025-02-13 08:06:54

2025-06-11 04:44:00

技巧Spring性能

2025-03-20 08:49:01

2010-08-05 14:16:37

路由器配置

2025-05-14 01:00:00

Spring工具工廠類

2019-04-12 10:03:38

云端數據集成數字化

2023-01-04 08:53:52

JPA實體類注解

2021-11-22 11:42:19

IT風險風險評估框架網絡安全

2025-02-21 16:00:00

SpringBoot代碼開發

2013-09-02 10:15:42

云備份云存儲云安全

2012-05-29 09:59:34

2014-02-18 09:37:54

政府云計算

2021-06-11 10:02:39

語言編程開發

2013-11-08 14:20:31

設計頁面設計

2019-06-04 10:40:07

2010-07-14 17:03:52

編程語言

2013-11-26 09:10:26

優化網絡基礎設施技巧

2017-01-12 11:07:25

網絡數據技巧

2024-12-31 08:03:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久久久 | 成人在线免费观看av | 亚洲欧美激情国产综合久久久 | 精品久久久久久久久久久 | 国产乱码精品一品二品 | 精品国产99 | 成人精品一区亚洲午夜久久久 | 国产人久久人人人人爽 | 国精日本亚洲欧州国产中文久久 | 国产午夜精品久久 | 97色伦网 | 婷婷去俺也去 | av中文字幕在线观看 | 国内精品久久影院 | 伦理二区| 九九福利 | a级黄色网| 日韩精品一区二区三区在线播放 | 中文字幕电影在线观看 | 中文字幕一区二区三区精彩视频 | 一区二区三区国产 | 日本在线视频中文字幕 | 久久r久久 | 日韩精品免费视频 | 亚洲国产精品视频 | 日日噜噜夜夜爽爽狠狠 | 日本三级做a全过程在线观看 | 日韩国产一区二区三区 | 日韩视频一区二区三区 | 久久精品视频9 | 成人一区二区三区在线观看 | 久久久久免费 | 黄色网址在线免费观看 | 四虎成人免费视频 | 人人看人人爽 | 欧美a区 | 五月婷婷导航 | 中文在线视频 | 美日韩免费视频 | 中文字幕第九页 | 日本小视频网站 |