JPA 標準註解 (javax.persistence.*) 配合 Hibernate 擴展註解 (org.hibernate.annotations.*) 可完全替代 .hbm.xml,實現「配置即代碼」,重構友好、類型安全。
@Entity
@Table(name = "t_user",
uniqueConstraints = @UniqueConstraint(columnNames = "email"),
indexes = @Index(name = "idx_user_name", columnList = "last_name, first_name"))
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // 二級緩存啟用
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;
@Column(name = "user_name", length = 50, nullable = false, updatable = false)
private String username;
@Column(name = "email", length = 100, unique = true)
private String email;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_at", updatable = false)
private Date createdAt;
@Version
@Column(name = "version")
private Integer version; // 樂觀鎖
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("createdAt DESC")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set orders = new LinkedHashSet<>();
@ManyToMany
@JoinTable(name = "t_user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
private Set roles = new HashSet<>();
// Getter/Setter/equals/hashCode...
}
| 註解 | 用途 |
|---|---|
@Entity | 聲明持久化實體 |
@Table | 指定表名、索引、約束 |
@Id + @GeneratedValue | 主鍵生成策略 (IDENTITY, SEQUENCE, UUID 等) |
@Column | 列屬性 (長度、非空、唯一、精度、插入/更新控制) |
@Temporal | 日期類型映射 (DATE, TIME, TIMESTAMP) |
@Version | 樂觀鎖版本字段 |
@Transient | 標記非持久化字段 |
@Lob | 大對象 (BLOB/CLOB) |
@Embedded / @Embeddable | 組合對象映射 (值對象) |
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.x</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.9.x</version>
</dependency>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="hibernate.javax.cache.provider">org.ehcache.jsr107.EhCacheCachingProvider</property>
<!-- 可選:啟用查詢緩存 -->
<property name="hibernate.cache.use_query_cache">true</property>
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)。| 策略 | 適用場景 | 特點 |
|---|---|---|
READ_ONLY | 極少變更的參考數據 (字典、配置) | 最高性能,無鎖,不支持更新 |
READ_WRITE | 常規業務數據 (用戶、訂單) | 支持更新,使用軟鎖/異步失效,中等性能 |
NONSTRICT_READ_WRITE | 低併發、容忍髒讀的數據 | 無嚴格鎖,性能較好,可能讀到過期數據 |
TRANSACTIONAL | 需強一致性、支持 XA 事務的環境 | 完全事務語義,需緩存提供者支持 (如 Infinispan) |
// HQL/JPQL 查詢啟用緩存
Query query = session.createQuery("from User where status = :status");
query.setParameter("status", 1);
query.setCacheable(true); // 關鍵:開啟查詢緩存
query.setCacheRegion("user.query.status"); // 可選:自定義緩存區域
List users = query.list();
session.update/delete/save 觸發相關緩存區域失效。sessionFactory.getCache().evictEntityRegion(User.class) 或 evictQueryRegion("regionName")。sessionFactory.getStatistics().getSecondLevelCacheStatistics(regionName) 獲取命中率、命中數、未命中數。RegionFactory。註解映射讓 ORM 配置回歸代碼本身,二級緩存是 Hibernate 性能優化的核心槓桿。**「精準啟用、合理選策略、分布式同步、持續監控」**是用好二級緩存的四字真言。