【问题标题】:Oracle sequence does not increment from Java/HibernateOracle 序列不会从 Java/Hibernate 递增
【发布时间】:2017-07-14 01:35:21
【问题描述】:

我有以下函数在 Oracle 序列上调用 nextval,但我注意到一个奇怪的行为。功能是:

public class DAOImplementation{
    private static SessionFactory factory;
    private Session session;

    public BigDecimal getSequenceNextVal(){
        BigDecimal result = null;
        factory = HibernateUtil.getSessionFactory();
        session = factory.openSession();
        String sql = "select sequence_test.nextval from dual";
        Query query = session.createSQLQuery(sql);
        result = (BigDecimal) query.uniqueResult();
        session.close();
        return result;        
    }
}

当我在控制台中打印上述函数返回的值时,我可以看到正确的下一个值。但是,当我在数据库“select sequence_test.currval from dual”上运行时,该值与控制台中的值不对应。 如果我从 PL/SQL Developer 重新连接到 Oracle DB 并运行“select sequence_test.nextval from dual”,结果会增加 2(我猜一次是由 java 函数,一次是由手动执行的查询)。

你能帮我理解一下这种情况吗?

【问题讨论】:

    标签: java oracle hibernate sequence


    【解决方案1】:

    sequence.currval 链接到您的数据库会话,实际上并不是您所指的序列的当前值。本质上,currval 将返回由nextval 为给定会话生成的最后一个值。

    这是因为序列可能会被多个会话更改,因此独立于会话的当前值的想法很少有意义。

    虽然这个属性的名称确实令人困惑......

    【讨论】:

    • 是的,他说的......当我看到这个贴出来的时候,我才刚刚开始写几乎相同的答案......
    • 感谢您的回答。我做了一个类似的函数来从 java 源获取当前值并且结果匹配。
    猜你喜欢
    • 2012-02-24
    • 2012-04-01
    • 2011-06-26
    • 1970-01-01
    • 2016-06-24
    • 2013-11-04
    • 2019-05-13
    • 2018-10-30
    • 2017-04-02
    相关资源
    最近更新 更多