我使用以下方法将对象集合保存到数据库。
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(主键)生成查询,一切正常。
有人可以帮我做我需要做的事情,以确保每次执行方法时(而不仅仅是第一次)运行主键自动生成查询。谢谢。
答案 0 :(得分:1)
您可能选择了增量生成器,它将最大值存储在内存中然后递增。当您有多个进程访问数据库时(即大多数情况下),此策略不适用。
选择其他策略(序列,表格,原生,取决于您的数据库功能和您的偏好)。