0

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

public Collection save(Collection instances) {

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


        } catch (RuntimeException re) {

            throw re;
        }
        return instances;
    }

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

从 table_name 中选择 max(Primary Key ID)

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

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

有人可以帮助我做些什么,以确保每次执行该方法时(而不仅仅是第一次)都运行主键自动生成查询。谢谢。

4

1 回答 1

1

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

选择另一种策略(序列、表、本机,具体取决于您的数据库功能和偏好)。

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

于 2012-04-16T21:56:02.503 回答