2013-12-10 2 views
0

У меня есть проект Spring Spring с использованием hibernate для хранения его данных в базе данных postgresql. Вручную записывать данные в базу данных и читать ее с помощью спящего режима. Однако сохранение вновь созданных объектов с гибернацией в базу данных завершается с ошибкой, потому что hibernate пытается записать нуль в столбец идентификатора соответствующей таблицы (который объявлен как первичный ключ).Hibernate не сгенерирует id

Здесь начало POJO:

@Entity 
@Table(name="recipes") 
public class Recipe implements Serializable { 

private static final long serialVersionUID = 3239162951065313443L; // generated by eclipse 

@Id 
@Column(name="id") 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer id; 

@Column(name="title") 
private String title; 

@Column(name="description") 
private String description; 

    // and so on ... 

Это мой метод в классе обслуживания:

public void add(String title, String description, String content, 
     int preparationEndurance, int totalEndurance, Date creation) { 
    logger.debug("Adding new recipe"); 

    // Retrieve session from Hibernate 
    Session session = sessionFactory.getCurrentSession(); 

    // Create a new Recipe 
    Recipe recipe = new Recipe(); 
    recipe.setTitle(title); 
    recipe.setDescription(description); 
    recipe.setContent(content); 
    recipe.setPreparationEndurance(preparationEndurance); 
    recipe.setTotalEndurance(totalEndurance); 
    recipe.setCreation(creation); 

    // Save 
    session.save(recipe); 
} 

Это основная причина, за исключением:

Schwerwiegend: Servlet.service() for servlet [appServlet] in context with path  [/webkochbuch] threw exception [Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause 
org.postgresql.util.PSQLException: FEHLER: NULL-Wert in Spalte „id“ verletzt Not-Null- Constraint 
Detail: Fehlgeschlagene Zeile enthält (null, n, b, v, 1, 7, 2013-12-10 16:33:49.478). 
at  org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2161) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1890) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:560) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:363) 
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) 
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) 
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96) 
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2989) 
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3501) 
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:393) 
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:227) 
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:207) 
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:191) 
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286) 
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192) 
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206) 
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191) 
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49) 
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:764) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:756) 
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:752) 
at org.cookbookgeeks.webkochbuch.service.RecipeService.add(RecipeService.java:92) 
at org.cookbookgeeks.webkochbuch.service.RecipeService$$FastClassByCGLIB$$d8f1ce7b.invoke(<generated>) 
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) 
at org.cookbookgeeks.webkochbuch.service.RecipeService$$EnhancerByCGLIB$$32728e81.add(<generated>) 
at org.cookbookgeeks.webkochbuch.web.RecipeController.addRecipe(RecipeController.java:84) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:744) 

Заранее спасибо за вашу помощь!

+0

У вас есть автоинкремент на столе? – Makky

+0

Столбец id относится к типу «serial». Я читал, что это целое число с ограничением, делающим его автоматическим приращением (по крайней мере, в postgres). – nsommer

+0

Устранение ограничений не приведет к автоматическому приращению. – Makky

ответ

3

Вы должны использовать Последовательность в базе данных Postgres.

Создание последовательности

CREATE SEQUENCE hibernate_sequence 
    INCREMENT 1 
    MAXVALUE 9223372036854775807 
    START 100000; 

Обновите свой ID в

@Id 
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen") 
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="HIBERNATE_SEQUENCE") 

Теперь, когда вы будете упорствовать он будет выбрать следующее значение из Sequence.

+0

Спасибо за ваш ответ, я постараюсь это скоро. Один вопрос: в чем причина 100000 как начало, а не, например. 0? (Я относительно новичок в системах баз данных и sql ...) – nsommer

+0

Причина, по которой я поставил 10000, если вы уже назначили некоторые идентификаторы. Вы также можете установить это значение равным 0. Если это помогает Thumb up и принять как aswer. – Makky

+0

к сожалению это не работает. Я сделал все, как вы объяснили, но такое же исключение. – nsommer

0

Используйте стратегию идентификации гиберната. Он создаст последовательность для вас. Попробуйте, это работает.

Смежные вопросы