使用 Hibernate 註解映射實體類時,發現 save()、find()、list() 操作正常,但 delete() 和 update() / merge() 執行後資料庫數據未變更,且控制台無任何錯誤日誌或異常拋出。
Hibernate 的寫操作必須在交易中執行。若未開啟交易或交易未提交:
// 錯誤示範
session.delete(entity); // 無交易包裹,操作不生效
// 正確寫法
Transaction tx = session.beginTransaction();
try {
session.delete(entity);
tx.commit();
} catch (Exception e) {
tx.rollback();
throw e;
}
刪除/修改依賴主鍵定位記錄。檢查:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) -- 或 SEQUENCE, AUTO
private Long id;
// ...
}
若實體來自其他 Session 或經過序列化/反序列化,需先合併:
User managed = session.merge(detachedUser); // 重新關聯到當前 Session
session.delete(managed);
<property name="hibernate.hbm2ddl.auto">update</property> -- 確保非 validate
<property name="hibernate.show_sql">true</property> -- 開啟 SQL 日誌觀察是否發送語句
show_sql=true 與 format_sql=true,確認 Hibernate 是否真正發送了 DELETE/UPDATE 語句@Transactional 註解(Spring 環境)或手動管理交易equals() / hashCode() 實現是否基於主鍵開發者最終發現是 未在 Service 方法上添加 @Transactional 註解,導致交易未提交。補全註解後問題解決。另一常見案例為 使用 MyISAM 引擎的 MySQL 表不支援交易,需轉換為 InnoDB。
Serializable 並基於業務主鍵實現 equals/hashCode