Hibernate如果记录不存在则插入

时间:2013-09-01 12:54:42

标签: java hibernate hql

如何使用Hibernate执行此操作 - 如果记录不存在,请插入。

我有以下专栏

Id(主键), 自动收报机符号, 股票名称, 行业, 部门, LASTUPDATE

我想查看Ticker Symbol Column中的记录,如果该字符串存在则不执行任何操作(如果该字符串不存在)则插入带有Id,Ticker Symbol,Ticker Name,Industry,Sector和Update Date的新行(今天是日期)。

我已经使用下面的代码创建了一个新表。

//Hibernate Create a Session Factory    
 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();         
 for (int i = 0; i < Bloomberg.getTickerSymbol().size(); i++){

            //Hibernate to store Stock Tickers Data     
        tickerInfo.setTickerSymbol(Bloomberg.getTickerSymbol().get(i)); //Symbol
        tickerInfo.setTickerName(Bloomberg.getTickerName().get(i)); //Name
        tickerInfo.setTickerSector(Bloomberg.getTickerSector().get(i)); //Sector
        tickerInfo.setTickerIndustry(Bloomberg.getTickerIndustry().get(i)); //Industry
        tickerInfo.setTickerLastUpdate(Calendar.getInstance().getTime()); //Update Date

        org.hibernate.Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.saveOrUpdate(tickerInfo);
        session.getTransaction().commit();
        session.close();
}

2 个答案:

答案 0 :(得分:1)

 //Hibernate Create a Session Factory    
 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();         
for (int i = 0; i < Bloomberg.getTickerSymbol().size(); i++){

        //Hibernate to store Stock Tickers Data     
    tickerInfo.setTickerSymbol(Bloomberg.getTickerSymbol().get(i)); //Symbol
    tickerInfo.setTickerName(Bloomberg.getTickerName().get(i)); //Name
    tickerInfo.setTickerSector(Bloomberg.getTickerSector().get(i)); //Sector
    tickerInfo.setTickerIndustry(Bloomberg.getTickerIndustry().get(i)); //Industry
    tickerInfo.setTickerLastUpdate(Calendar.getInstance().getTime()); //Update Date

    org.hibernate.Session session = sessionFactory.openSession();
    List tickerInfos = session.createCriteria(TickerInfo.class).add(Restrictions.eq("tickerSymbol", Bloomberg.getTickerSymbol().get(i))).list();
   if(tickerInfos.size()<1){
         session.beginTransaction(); 
         session.saveOrUpdate(tickerInfo);
         session.getTransaction().commit();
   }
   session.close();
 }

答案 1 :(得分:0)

选项可以是在数据库中创建唯一约束,尝试更新,并在违反约束时捕获异常。

更好的方法可能是将此与已知添加的股票代码符号的本地缓存混合(假设从不删除符号),这应该减少到正在进行的数据库调用量。