【发布时间】:2016-04-04 20:08:05
【问题描述】:
我对休眠比较陌生,并且正在寻找仅当复合键不存在时才插入新记录并更新它的任何机制。
我尝试使用 saveOrUpdate 方法,但似乎它只适用于会话中的对象。 我想要一些应该在数据库中查询的机制,如果数据已经存在于数据库中,那么更新记录,否则插入它。
谢谢,
阿曼迪普
【问题讨论】:
-
这样做:查询数据库,如果找到对象,更新它,否则,持久化它。 Hibernate 不会为您这样做。
我对休眠比较陌生,并且正在寻找仅当复合键不存在时才插入新记录并更新它的任何机制。
我尝试使用 saveOrUpdate 方法,但似乎它只适用于会话中的对象。 我想要一些应该在数据库中查询的机制,如果数据已经存在于数据库中,那么更新记录,否则插入它。
谢谢,
阿曼迪普
【问题讨论】:
正如休眠文档中提到的,saveOrUpdate() 方法应该满足您的要求。Hibernate Session doc
void saveOrUpdate(Object object) throws HibernateException 保存(对象)或更新(对象)给定的实例,取决于解决方案 未保存值检查(有关未保存值的讨论,请参见手册 检查)。此操作级联到关联的实例,如果 关联与 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);
【讨论】: