我对hibernate相对较新,并且只在复合键不存在时才会查找我插入新记录的任何机制,否则更新它。
我尝试使用saveOrUpdate方法,但似乎它只适用于会话中的对象。 我想要一些应该在数据库中查询的机制,如果数据已经存在于数据库中,那么更新记录,否则插入它。
谢谢,
爱玛
答案 0 :(得分:0)
正如hibernate文档中所提到的,saveOrUpdate()方法应满足您的要求。Hibernate Session doc
void saveOrUpdate(Object object) 抛出HibernateException根据分辨率,保存(Object)或更新(Object)给定的实例 未保存值检查(有关未保存值的讨论,请参阅手册 检查)。如果是,则此操作级联到关联的实例 使用cascade =" save-update"。
映射关联参数:object - 包含new的瞬态或分离实例 或更新状态
发布示例代码供您参考: 在下面的方法中,Stock对象被新插入到数据库中。
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();
然后在另一种方法中,你打开一个新的Session,然后尝试插入或更新一个Stock对象(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值。在这种情况下,CascaseType设置为ALL。
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = false)
@JoinColumn(name = "stockId", updatable = true, insertable = true)
private Set<StockRecord> stockRecords =
new HashSet<StockRecord>(0);