2016-04-04 68 views
0

我是相對較新的休眠和尋找任何機制,只有當複合鍵不存在,否則更新它,我插入新記錄。休眠保存數據,如果不存在數據庫中更新它

我試着用saveOrUpdate方法,但似乎它只適用於會話中的對象。 我想要一些機制,應該查詢數據庫,如果數據已經存在數據庫中,然後更新記錄,否則插入它。

感謝,

愛瑪

+0

這樣做:查詢數據庫,如果找到該對象,則更新它,否則,將其保留。休眠不會爲你做到這一點。 –

回答

0

也在Hibernate文檔提到,saveOrUpdate()方法的方法應該可以滿足您的要求。 Hibernate Session doc

空隙saveOrUpdate(Object對象) 拋出HibernateException的要麼保存(對象)或更新(Object)將給定的實例,這取決於 未保存值檢查的分辨率(參見未保存值的討論手動 檢查)。如果 關聯映射爲cascade =「save-update」,則此操作將級聯到關聯的實例。

參數:對象 - 包含新 或更新的狀態

過帳示例代碼以供參考的瞬時或拆卸實例: 在下面的方法中的股票對象被新插入到數據庫中。

Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 

     Stock stock = new Stock(); 
     stock.setStockId(70); 
     stock.setStockCode("7052"); 
     stock.setStockName("TEST SAVE"); 

     StockRecord stockRecords = new StockRecord(); 
     stockyRecords.setDaily_record_id(80); 
     stockRecords.setPriceOpen(new Float("1.2")); 
     stockRecords.setPriceClose(new Float("1.1")); 
     stockRecords.setPriceChange(new Float("10.0")); 

     stockRecords.setStock(stock);   
     stock.getStockRecords().add(stockRecords); 

     session.save(stock); 
     session.save(stockRecords); 

     session.getTransaction().commit(); 
     session.close(); 

然後在另一個方法,你打開一個新的會話,然後嘗試插入或更新一個股票對象(StockId是主鍵,如果你把相同的ID,它將更新,如果你給一個新的ID ,它會插入,在這裏我都保留它作爲70)

public static void testSaveOrUpdate(){  
     Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 
     Stock stock = new Stock(); 
     stock.setStockId(70); 
     stock.setStockCode("7052"); 
     stock.setStockName("Test SaveOrUpdate"); 

     StockRecord stockRecords = new StockRecord(); 
     stockRecords.setDaily_record_id(90); 
     stockRecords.setPriceOpen(new Float("1.3")); 
     stockRecords.setPriceClose(new Float("1.1")); 
     stockRecords.setPriceChange(new Float("10.0")); 

     stockRecords.setStock(stock);   
     stock.getStockRecords().add(stockRecords); 

     session.saveOrUpdate(stock);   
     session.getTransaction().commit(); 
    } 

只要確保,如果你有其他一些實體的關係(在這種情況下StockRecord)你給適當的CASCADE value.In這種情況下, CascaseType設置爲ALL。

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = false) 
    @JoinColumn(name = "stockId", updatable = true, insertable = true) 
    private Set<StockRecord> stockRecords = 
          new HashSet<StockRecord>(0);