【问题标题】:Hibernate Insert if record does not exist如果记录不存在则休眠插入
【发布时间】:2013-09-01 12:54:42
【问题描述】:

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

我有以下列

Id(主键), 股票代码, 代码名称, 行业, 部门, 最后更新

如果字符串存在,我想检查代码符号列中的记录 如果字符串不存在,则不执行任何操作,然后插入带有 ID、代码符号、代码名称、行业、部门和更新日期的新行(今天日期)。

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

//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();
}

【问题讨论】:

    标签: java hibernate hql


    【解决方案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();
    

    【讨论】:

    • 谢谢,现在就试试这个。
    【解决方案2】:

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

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

    【讨论】:

    • 你不应该控制有异常的程序流。 Joshua Bloch 撰写的 Effective Java 第 9 章中的第 57 条
    • 我认为这取决于特殊情况。如果 99% 的时间它都不存在,那么我们可以很好地捕获异常。例如验光检查。此外,反对异常的理由之一是开销,与必须执行 2 次数据库调用相比,这算不了什么。
    • @samblake 好点,但如果您插入一组包含一些存在和一些不存在的记录,它的效果会很差
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2012-03-28
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多