Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.BatchUpdateException:ORA-00001:生成主键时的唯一约束_Java_Sql_Hibernate_Jdbc - Fatal编程技术网

java.sql.BatchUpdateException:ORA-00001:生成主键时的唯一约束

java.sql.BatchUpdateException:ORA-00001:生成主键时的唯一约束,java,sql,hibernate,jdbc,Java,Sql,Hibernate,Jdbc,我正在使用Oracle数据库。我们的服务电话经常出现故障。当我查看日志时,我在表上看到以下异常 java.sql.BatchUpdateException:ORA-00001:唯一约束 我们实现了主键生成 请找到密码 历史 类文件 包com.generator; 导入java.io.Serializable; 导入java.sql.Connection; 导入java.sql.PreparedStatement; 导入java.sql.ResultSet; 导入java.sql.SQLExc

我正在使用Oracle数据库。我们的服务电话经常出现故障。当我查看日志时,我在表上看到以下异常

java.sql.BatchUpdateException:ORA-00001:唯一约束

我们实现了主键生成

请找到密码


历史
类文件

包com.generator;
导入java.io.Serializable;
导入java.sql.Connection;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.util.Properties;
导入org.apache.log4j.Logger;
导入org.hibernate.hibernateeexception;
导入org.hibernate.MappingException;
导入org.hibernate.dialogue.dialogue;
导入org.hibernate.engine.SessionImplementor;
导入org.hibernate.id.Configurable;
导入org.hibernate.id.IdentifierGenerator;
导入org.hibernate.type.type;
公共类SequenceGenerator实现IdentifierGenerator,可配置{
私有静态记录器=Logger.getLogger(SequenceGenerator.class);
字符串表名;
public void configure(类型arg0、属性arg1、方言arg2)引发MappingException{
tableName=arg1.getProperty(“TABLE_NAME”);
}
公共序列化生成(SessionImplementor arg0,对象arg1)引发HibernateException{
返回getNextValue(arg0);
}
可公开序列化的getNextValue(SessionImplementor会话){
Long nextValue=null;
PreparedStatement PreparedStatement=null;
ResultSet ResultSet=null;
试一试{
Connection=session.Connection();
preparedStatement=connection.prepareStatement(“从SEQ_GENERATOR中选择SEQ_GENERATOR_值,其中SEQ_GENERATOR_表=?”;
preparedStatement.setString(1,表名);
resultSet=preparedStatement.executeQuery();
while(resultSet.next()){
nextValue=resultSet.getLong(“序列生成器值”);
}
resultSet.close();
preparedStatement.close();
preparedStatement=connection.prepareStatement(“更新序列发电机组序列发电机组值=?其中序列发电机组表=?”;
准备好的报表。setLong(1,下一个值+1);
preparedStatement.setString(2,表名);
preparedStatement.executeUpdate();
}捕获(SQLE异常){
debug(例如getMessage());
}捕获(例外e){
debug(例如getMessage());
}
最后{
试一试{
resultSet.close();
preparedStatement.close();
}捕获(SQLE异常){
debug(例如getMessage());
}
}
返回下一个值;
}
}

我们将用oracle sequence替换此代码

将同步添加到getNextValue方法

 synchronized public Serializable getNextValue(SessionImplementor session)

测试并让我知道结果应该有效。

从seq_generator表中选择时,需要创建一个独占锁

试试这个

preparedStatement = connection.prepareStatement("SELECT SEQ_GENERATOR_VALUE FROM SEQ_GENERATOR WHERE SEQ_GENERATOR_TABLE = ? FOR UPDATE");

当然,提交必须在getNextValue方法的末尾进行,因为主键不是唯一的。也可以尝试在preparedStatement.executeUpdate()之后进行提交;