自動掃描 Java 專案中的 @Entity 類別,分析其結構並生成完整的實體規格文件。
自動掃描 Java 專案中的 @Entity 類別,分析其結構並生成完整的實體規格文件。
# 掃描特定 package 下的所有 Entity
生成 src/main/java/com/example/domain 下所有 Entity 的規格文件
# 掃描整個專案的 Entity
生成專案中所有 @Entity 類別的規格文件
# 只生成特定 Entity 的文件
生成 User Entity 的規格文件
# 找出所有標註 @Entity 的 Java 檔案
find <target_path> -name "*.java" -type f -exec grep -l "@Entity" {} \;
# 或使用 grep 遞歸搜尋
grep -rl "@Entity" <target_path> --include="*.java"
對每個 Entity 檔案進行以下分析:
public class XXX 提取package 語句提取// 提取所有欄位及其註解
- @Id, @GeneratedValue
- @Column (name, nullable, length, unique)
- @Enumerated
- @Embedded
- @Version
- @CreatedDate, @LastModifiedDate
- @CreatedBy, @LastModifiedBy
- @OneToOne (mappedBy, cascade, fetch, orphanRemoval)
- @OneToMany (mappedBy, cascade, fetch, orphanRemoval)
- @ManyToOne (fetch, cascade)
- @ManyToMany (mappedBy, cascade, fetch)
- @JoinColumn, @JoinTable
- @Table(uniqueConstraints, indexes)
- @UniqueConstraint
- @Index
為每個 Entity 生成包含以下章節的 Markdown 文件:
# Entity 規格文件:<EntityName>
## 1. 基本資訊
- **Entity 名稱**:從類別名稱提取
- **Package**:從 package 語句提取
- **資料庫表名**:從 @Table(name="xxx") 提取,預設為類別名的蛇形命名
- **描述**:從 JavaDoc 提取
- **Aggregate Root**:檢查是否有 @AggregateRoot 或相關註解
- **建立日期**:從 Git 歷史或檔案時間戳提取
## 2. 身份標識
- **主鍵欄位**:標註 @Id 的欄位
- **主鍵類型**:欄位的 Java 類型
- **生成策略**:@GeneratedValue(strategy=XXX)
- **序列名稱**:如使用 SEQUENCE 策略
- **複合鍵**:檢查 @IdClass 或 @EmbeddedId
## 3. 欄位定義
| 欄位名稱 | Java 類型 | 資料庫欄位 | 必填 | 長度 | 預設值 | 說明 |
|---------|----------|-----------|-----|------|--------|------|
| 從欄位註解自動提取 | | | | | | 從 JavaDoc 提取 |
### Value Objects
列出所有 @Embedded 的值物件
## 4. 驗證規則
從以下註解提取:
- @NotNull, @NotBlank, @NotEmpty
- @Size(min, max)
- @Min, @Max
- @Pattern(regexp)
- @Email
- @Past, @Future
- @Positive, @PositiveOrZero
- 自定義驗證註解
## 5. 不變條件 (Invariants)
從業務方法中的驗證邏輯提取:
```java
// 尋找方法中的 if 條件、throw 語句
// 尋找 Objects.requireNonNull
// 尋找 Assert.xxx 語句
```
## 6. 關聯關係
| 關聯類型 | 目標 Entity | 映射欄位 | Fetch 策略 | Cascade 類型 | 說明 |
|---------|------------|---------|-----------|-------------|------|
| 從關聯註解提取 | | | | | |
## 7. 生命週期管理
### 建構方式
- 公開建構子
- 靜態工廠方法
- Builder pattern
### 狀態欄位
檢查是否有 status, state 等列舉型欄位
### 軟刪除
- deletedAt: 檢查 LocalDateTime/Instant 類型欄位
- deleted/isDeleted: 檢查 Boolean 類型欄位
- @SQLDelete, @Where 註解
### 版本控制
- @Version 註解的欄位
## 8. 持久化映射
### 表結構
```sql
-- 從 @Table, @Column 註解生成 CREATE TABLE 語句
```
### 索引定義
- 從 @Table(indexes={...}) 提取
- 從 @Index 註解提取
### 特殊類型映射
- @Type 註解
- @Convert 轉換器
- @Enumerated(EnumType.STRING/ORDINAL)
- @Lob
## 9. 領域行為
### 業務方法列表
列出所有非 getter/setter 的公開方法
| 方法名稱 | 參數 | 返回值 | 說明 |
|---------|------|--------|------|
| 從方法簽章提取 | | | 從 JavaDoc 提取 |
### 主要業務邏輯
提取關鍵方法的實作邏輯摘要
## 10. 領域事件
檢查方法中是否有:
- applicationEventPublisher.publishEvent(...)
- DomainEvents.publish(...)
- 返回 DomainEvent 列表
## 11. 審計與多租戶
### 審計欄位
- @CreatedDate, @LastModifiedDate
- @CreatedBy, @LastModifiedBy
- @EntityListeners(AuditingEntityListener.class)
### 多租戶
- tenantId 欄位
- @TenantId 註解
- @Filter 註解
## 12. API 契約對應
搜尋對應的 DTO 類別:
- <EntityName>Request
- <EntityName>Response
- <EntityName>DTO
列出欄位映射關係
## 13. 使用範例
```java
// 從測試檔案提取範例
// 搜尋 <EntityName>Test.java
// 搜尋 <EntityName>Repository 的使用
```
## 14. 注意事項與限制
列出:
- TODO, FIXME 註解
- @Deprecated 標記
- 特殊的業務約束註解
## 15. 變更歷史
```bash
# 從 Git 歷史提取
git log --follow --format="%ai %aN %s" -- <entity_file_path> | head -10
```
---
*此文件由 Entity Documentation Generator 自動生成*
*生成時間:<timestamp>*
生成單獨的 Markdown 檔案:
docs/entities/<EntityName>.md
生成索引頁和個別文件:
docs/entities/
├── README.md # 索引頁,列出所有 Entity
├── User.md
├── Order.md
└── Product.md
使用 Mermaid 語法生成 Entity 關聯圖:
erDiagram
User ||--o{ Order : places
Order ||--|{ OrderItem : contains
Product ||--o{ OrderItem : "ordered in"
分析 Entity 之間的依賴關係:
檢查 Entity 是否遵循最佳實踐:
# 提取類別名稱
grep -oP '(?<=class\s)\w+' file.java
# 提取 @Table 的 name 屬性
grep -oP '(?<=@Table\(name\s=\s")[^"]+' file.java
# 提取所有欄位定義
grep -E '^\s*(private|protected|public)\s+\w+(<.*>)?\s+\w+\s*;' file.java
建立註解解析對照表:
# 主鍵相關
@Id → 主鍵欄位
@GeneratedValue(strategy = GenerationType.IDENTITY) → 自增
@GeneratedValue(strategy = GenerationType.SEQUENCE) → 序列
@GeneratedValue(strategy = GenerationType.UUID) → UUID
# 欄位映射
@Column(nullable = false) → 必填
@Column(length = 100) → 長度限制
@Column(unique = true) → 唯一約束
完整的輸出會類似:
# Entity 規格文件:User
## 1. 基本資訊
- **Entity 名稱**:User
- **Package**:com.example.domain.user
- **資料庫表名**:users
- **描述**:系統使用者實體,代表註冊用戶
- **Aggregate Root**:是
- **建立日期**:2024-01-15
## 2. 身份標識
- **主鍵欄位**:id
- **主鍵類型**:Long
- **生成策略**:IDENTITY(資料庫自增)
- **業務鍵**:email(唯一)
## 3. 欄位定義
| 欄位名稱 | Java 類型 | 資料庫欄位 | 必填 | 長度 | 預設值 | 說明 |
|---------|----------|-----------|-----|------|--------|------|
| id | Long | id | ✓ | - | AUTO | 主鍵 |
| email | String | email | ✓ | 255 | - | 使用者電子郵件 |
| username | String | username | ✓ | 50 | - | 使用者名稱 |
| password | String | password | ✓ | 255 | - | 加密後密碼 |
| status | UserStatus | status | ✓ | - | ACTIVE | 帳號狀態 |
| createdAt | LocalDateTime | created_at | ✓ | - | now() | 建立時間 |
...(其他章節)