首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Hibernate 自動建表僅保存部分資料:物件複用導致覆蓋

     編輯:程式設計疑難解答

現象:三筆資料入庫,資料庫只有一筆「棉花糖」

資料庫截圖

根本原因:同一物件實例重複 setProperty


Product pro = new Product();
pro.setName("棉花糖"); pro.setDir("..."); session.save(pro); // 第1筆
pro.setName("巧克力"); pro.setDir("..."); session.save(pro); // 第2筆 → 其實更新同一行
pro.setName("餅乾");   pro.setDir("..."); session.save(pro); // 第3筆 → 又更新同一行

Hibernate 的 save() 對**同一個持久化物件**只會執行一次 INSERT,後續呼叫變為 UPDATE(主鍵相同)。

修正:每筆資料 new 新實例


Product pro1 = new Product();
pro1.setName("棉花糖"); pro1.setDir("..."); session.save(pro1);

Product pro2 = new Product();
pro2.setName("巧克力"); pro2.setDir("..."); session.save(pro2);

Product pro3 = new Product();
pro3.setName("餅乾");   pro3.setDir("..."); session.save(pro3);

延伸:批次儲存最佳實踐


List products = Arrays.asList(
    new Product("棉花糖", "..."),
    new Product("巧克力", "..."),
    new Product("餅乾", "...")
);
products.forEach(session::save);
// 或使用 session.saveAll(products) (Hibernate 5.2+)

關鍵觀念

  • 一個實體實例 = 資料庫一行(由主鍵決定)。
  • 同一實例多次 save 不會產生多行。
  • 若需複製相似資料,請用建構子或 Builder 建立**新實例**,而非重複 set 同一物件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved