如果数据不存在,则Hibernate保存数据,否则更新它

时间:2016-04-04 20:08:06

标签: java mysql hibernate

我对hibernate相对较新,并且只在复合键不存在时才会查找我插入新记录的任何机制,否则更新它。

我尝试使用saveOrUpdate方法,但似乎它只适用于会话中的对象。 我想要一些应该在数据库中查询的机制,如果数据已经存在于数据库中,那么更新记录,否则插入它。

谢谢,

爱玛

1 个答案:

答案 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);