Не удалось синхронизировать состояние базы данных с исключением сеанса в спящем режиме - PullRequest
1 голос
/ 28 ноября 2011

У меня есть таблица 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;
}

и при попытке вставить строку в базу данных появляется исключение «Не удалось синхронизировать состояние базы данных с сеансом»:

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, admi222222222n@xeno-solutions.com, 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 Script для добавления данных в базу данных

Ответы [ 3 ]

3 голосов
/ 28 ноября 2011

В журнале записывается:

119658 [http-bio-8080-exec-2] ОШИБКА org.hibernate.util.JDBCExceptionReporter - ОШИБКА: двойное значение ключа нарушает уникальное ограничение "employee_pkey" Подробности:Ключ (employee_id) = (10) уже существует.

Идентификаторы должны быть уникальными, но вы попытались создать нового сотрудника с идентификатором, который уже существует в базе данных.Задача генератора идентификаторов состоит в том, чтобы гарантировать, что такого не произойдет.

Документация Hibernate пишет :

SEQUENCE (в Hibernate называется seqhilo): использует алгоритм hi / lo для эффективной генерации идентификаторов типа long, short или int при заданной именованной последовательности базы данных.

Наиболее распространенная причина сбоя этого генератора заключается в том, что его последовательность вышла изсинхронизироваться с таблицами сущностей, например, потому что сущности были созданы без перехода в спящий режим (например, с помощью сценария SQL), а последовательность не обновлена.

0 голосов
/ 29 ноября 2011

Я решил проблему с помощью GenerationType.IDENTITY

public class Employee implements Serializable {

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

, который будет создавать для каждой последовательности таблиц, и в сценарии sql мы не добавляем идентификатор в оператор вставки

0 голосов
/ 28 ноября 2011

Я думаю, что строка:

Detail: Key (employee_id)=(10) already exists

отдает это. Проверьте вашу базу данных на наличие:

select * from employee where employee_id=10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...