Hibernate模板SaveOrUpdateALL主键自动生成

时间:2012-04-16 18:42:29

标签: hibernate java-ee

我使用以下方法将对象集合保存到数据库。

public Collection save(Collection instances) {

        try {
            this.getHibernateTemplate().saveOrUpdateAll(instances);
            this.getHibernateTemplate().flush();


        } catch (RuntimeException re) {

            throw re;
        }
        return instances;
    }

实例的主键由HibernateTemplate自动生成。在JVM Startup之后,当第一次调用此方法时,Hibernate运行以下查询以获取要在实例上使用的Max主键。

从table_name

中选择max(主键ID)

但是第二次执行该方法时,我看不到正在执行此查询。看起来hibernate在会话中的某个地方存储了这个值。

现在,如果表由另一个进程更新(比如存储过程或SQL),则对上述方法的所有后续调用都会因ORA-00001:唯一约束(SCHEMANAME.PRIMARY_KEY_CONSTRAINT)违反异常而失败。如果JVM重新启动,Hibernate会再次执行max(主键)生成查询,一切正常。

有人可以帮我做我需要做的事情,以确保每次执行方法时(而不仅仅是第一次)运行主键自动生成查询。谢谢。

1 个答案:

答案 0 :(得分:1)

您可能选择了增量生成器,它将最大值存储在内存中然后递增。当您有多个进程访问数据库时(即大多数情况下),此策略不适用。

选择其他策略(序列,表格,原生,取决于您的数据库功能和您的偏好)。

有关详细信息,请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-generator