Assignments: Cannot create an assignment - stacktrace

Description

I attempted to create an assignment and publish it. Clicking Publish sent me to the top of the page and now I see "Edit" beside the assignment title. There's a stack trace on the server.

Trying to "Cancel" so I can get out of this screen and I receive a user-facing stack trace.

15-Oct-2020 18:50:14.755 ERROR [http-nio-20013-exec-15] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions Field 'ID' doesn't have a default value 15-Oct-2020 18:50:14.757 WARN [http-nio-20013-exec-15] org.sakaiproject.cheftool.VelocityPortletPaneledAction.actionDispatch Exception calling method doAssignment_form java.lang.reflect.InvocationTargetException (Caused by javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute statement) java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.sakaiproject.cheftool.VelocityPortletPaneledAction.actionDispatch(VelocityPortletPaneledAction.java:740) at org.sakaiproject.cheftool.VelocityPortletPaneledAction.processAction(VelocityPortletPaneledAction.java:549) at org.sakaiproject.cheftool.ToolServlet.doGet(ToolServlet.java:228) at org.sakaiproject.cheftool.VelocityPortletPaneledAction.doGet(VelocityPortletPaneledAction.java:1081) at org.sakaiproject.cheftool.ToolServlet.doPost(ToolServlet.java:152) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.sakaiproject.vm.ComponentServlet.service(ComponentServlet.java:56) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:447) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:352) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) at org.sakaiproject.tool.impl.ActiveToolComponent$MyActiveTool.forward(ActiveToolComponent.java:508) at org.sakaiproject.portal.charon.SkinnableCharonPortal.forwardTool(SkinnableCharonPortal.java:1502) at org.sakaiproject.portal.charon.handlers.SiteHandler.doToolBuffer(SiteHandler.java:1254) at org.sakaiproject.portal.charon.handlers.SiteHandler.bufferContent(SiteHandler.java:1088) at org.sakaiproject.portal.charon.handlers.SiteHandler.doSite(SiteHandler.java:499) at org.sakaiproject.portal.charon.handlers.SiteHandler.doGet(SiteHandler.java:275) at org.sakaiproject.portal.charon.handlers.SiteHandler.doGet(SiteHandler.java:163) at org.sakaiproject.portal.charon.handlers.WorksiteHandler.doPost(WorksiteHandler.java:69) at org.sakaiproject.portal.charon.SkinnableCharonPortal.doPost(SkinnableCharonPortal.java:1175) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.sakaiproject.util.RequestFilter.doFilter(RequestFilter.java:496) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:679) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute statement at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:917) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:891) at org.sakaiproject.tasks.impl.TaskServiceImpl.createTask(TaskServiceImpl.java:93) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy222.createTask(Unknown Source) at org.sakaiproject.assignment.impl.AssignmentServiceImpl.updateAssignment(AssignmentServiceImpl.java:1270) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy216.updateAssignment(Unknown Source) at org.sakaiproject.assignment.tool.AssignmentAction.commitAssignment(AssignmentAction.java:8917) at org.sakaiproject.assignment.tool.AssignmentAction.post_save_assignment(AssignmentAction.java:7930) at org.sakaiproject.assignment.tool.AssignmentAction.doPost_assignment(AssignmentAction.java:7595) at org.sakaiproject.assignment.tool.AssignmentAction.doAssignment_form(AssignmentAction.java:10259) ... 57 more Caused by: org.hibernate.exception.GenericJDBCException: could not execute statement at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178) at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3090) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3683) at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:332) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:289) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:196) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:127) at org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:287) at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:259) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:191) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:72) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:905) ... 88 more Caused by: java.sql.SQLException: Field 'ID' doesn't have a default value at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1274) at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:780) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175) ... 106 more

 
 

Attachments

1
  • 15 Oct 2020, 06:11 PM

Activity

Show:

Andrea Schmidt October 25, 2021 at 11:29 PM

Verified on 20x: https://qa20-mysql.nightly.sakaiproject.org/, build: dbd3dbd7

Earle Nietzel October 25, 2021 at 3:28 PM

Committed a modified version of this patch to 20.x which added the oracle sequence BULLHORN_ALERTS_S. The Task and UserTask were removed as they’re not in 20.x.

Andrea Schmidt October 27, 2020 at 6:09 PM

Verified on 21x: https://qa21-mysql.nightly.sakaiproject.org/, build: 4a77b02d

Brian J. October 27, 2020 at 1:43 PM

Thanks, Earle!

Earle Nietzel October 27, 2020 at 1:17 PM

As part of the recent Spring/Hibernate upgrade SAK-43968, a side effect was detected where ID column generation had changed this lead to https://sakaiproject.atlassian.net/browse/SAK-44207#icft=SAK-44207 which sets the property  hibernate.id.new_generator_mappings to false reverting hibernate ID generation back to how it was previously done.
 
The way I've understood this property is that:

  • JPA applications should set this to true as it provides better compatibility with JPA and it's databases.

  • Hibernate applications should set this property to false (this is the mode that Sakai supports)
     
    While Sakai is transitioning to JPA the mode in the current mode that most of Sakai implements is Hibernate native this can be witnessed by the JPA EntityManager being unwrapped and the underlying Hibernate SessionFactory being used in most of Sakai, except for places that use Spring Data aka Rubrics which require the JPA EntityManager.
     
    It's very likely that in the near future possibly Sakai 22 we will move to supporting JPA EntityManager fully and remove this Hybrid approach, and when that happens we will be a JPA application vs a Hibernate application.
     
    So for those dev's where there db was caught in the middle of this you will need to recreate your dev databases to avoid exceptions like the following:
    Caused by: java.sql.SQLException: Field 'ID' doesn't have a default value
     
    If recreating your dev db is not an option then there are a few ways you can go about fixing this,  starting with a new db leaving your existing db intact and perform one of the following that best suit your needs:

  • copy table data from the existing db to the newer one

  • perform a liquibase comparison between the 2 dbs see https://docs.liquibase.com/commands/community/home.html and evolve the existing database to match the schema of the new database.
     
    Essentially what you're looking to do is to undo the schema changes that the option hibernate.id.new_generator_mappings=true did to your schema.

Fixed

Details

Priority

Affects versions

Fix versions

Components

Assignee

Reporter

Environment

22x: https://trunk-mysql.nightly.sakaiproject.org/, build: 33cd5d20 Win10: Chrome
Created October 15, 2020 at 6:06 PM
Updated October 25, 2021 at 11:29 PM
Resolved October 16, 2020 at 9:28 AM

Flag notifications