java - 无法将数据库状态与 hibernate 中的 session 异常同步

标签 java hibernate jpa

我有一个表 bean:

public class Employee implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "employee_id", unique = true, nullable = false)
    @Basic(fetch = FetchType.EAGER)
    private long id;
}

当我尝试在数据库中插入行时,出现异常“无法将数据库状态与 session 同步”:

19658 [http-bio-8080-exec-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null
119658 [http-bio-8080-exec-2] ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into employee (basic_salary, code, fk_department_id, email, first_name, ip_phone_extension, is_default, last_name, password, threshold, voice_model, voice_validate, employee_id) values (NULL, 222, NULL, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5637323b3f64646464646464646438162e3338397b25393a23223f3938257835393b" rel="noreferrer noopener nofollow">[email protected]</a>, sdfasfd, 21312, 0, fdsafsad, 2, NULL, NULL, NULL, 10) was aborted.  Call getNextException to see the cause.
119658 [http-bio-8080-exec-2] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 23505
119658 [http-bio-8080-exec-2] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: duplicate key value violates unique constraint "employee_pkey"
  Detail: Key (employee_id)=(10) already exists.
119658 [http-bio-8080-exec-2] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:179)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy35.addEmployee(Unknown Source)
    at com.xeno.phoneSuite.beans.EmployeeBean.addOrUpdateEmployee(EmployeeBean.java:256)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)

为什么会出现这个异常以及如何解决它? 注意:我使用sql脚本将数据添加到数据库

最佳答案

日志中写道:

119658 [http-bio-8080-exec-2] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: duplicate key value violates unique constraint "employee_pkey" Detail: Key (employee_id)=(10) already exists.

ID 必须是唯一的,但您尝试使用数据库中已存在的 ID 创建新员工。 id 生成器的工作就是确保这种事情不会发生。

hibernate 文档 writes :

SEQUENCE (called seqhilo in Hibernate): uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a named database sequence.

生成器失败的最常见原因是其序列与实体表不同步,例如因为实体是在没有经过 hibernate 的情况下创建的(例如通过 SQL 脚本),并且序列未更新。

关于java - 无法将数据库状态与 hibernate 中的 session 异常同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8299378/

相关文章:

java - 从检索 jasper 报告中两个实体的查询中获取值

java - 使用自定义比较器的最大流

java - 如何在 ServletContextListener 中获取正在运行的应用程序的 URL?

java - Hibernate PersistenceContext session 刷新

java - JPA中惰性对象的奇怪初始化

java - 如何使用 jpa 规范向子查询添加和构建动态谓词?

启动时的 Java Web 应用程序

java - 如何使用 java 和 postgresql 知道表中的哪一行被更改

java - 如何在hibernate 3中执行存储过程

java - 如何在Spring Boot应用程序中的@Transactional方法中使用纯Hibernate保证原子批量插入