Исправлено: Похоже, что проблема в файле VM. При добавлении коллекции сущностей в другую коллекцию сущностей файлы VM #if проверяют, существует ли присвоение объекта или нет. Это было связано с тем, что назначение изменилось с обычной одномерной коллекции на 2-мерную коллекцию коллекции. Все, что мне нужно было сделать, это изменить проверку if, чтобы увидеть, не является ли что-то конкретное внутри коллекции назначений нулевым. Эта проблема отображается как проблема с отложенным сохранением, но оказывается, что первоначальная причина проблемы не имела к ней никакого отношения.
Редактировать 2: Добавлен @override в метод инициализации для объекта, и он, кажется, работает. Обновится, если что-то изменится.
Редактировать: выяснилось, что создание новой сущности не вызывает проблемы, но создает проблему позже при возвращении к редактированию назначения. Хотя не уверен почему, но я думаю, что это могут быть ссылки или ссылки между новой таблицей БД сущностей и исходной таблицей сущностей присваивания.
Я уже давно борюсь с проблемой ленивого спящего состояния и не могу найти что-то конкретное для моей ситуации, которое работает. Справочная информация по используемому коду:
- Внешний интерфейс: макрос скорости, HTML, CSS, JS
- Серверная часть: Java, Javax Persistence, Hibernate
Фон в системе:
Система в основном представляет собой систему LMS. В настоящее время я занят той частью, где вам разрешено создавать задания для студентов, которые также могут отправлять. Исходная сущность, которая сохраняет назначение, не изменилась и продолжает работать, но теперь, если я сохраняю новую сущность после сохранения назначения, кажется, что сеанс или что-то сбрасывается? Новый объект корректно отображается в БД (проверяется, правильно ли сохранена информация в БД вручную), но если я вернусь к редактированию назначения через пользовательский интерфейс, я получу следующее:
org.apache.velocity.exception.VelocityException: Reference evaluation threw an exception at /vm/assignment/chef_assignments_instructor_new_edit_assignment.vm[line 540, column 37]
at org.apache.velocity.runtime.parser.node.ASTReference.evaluate(ASTReference.java:491)
at org.apache.velocity.runtime.parser.node.ASTAndNode.evaluate(ASTAndNode.java:104)
at org.apache.velocity.runtime.parser.node.ASTAndNode.evaluate(ASTAndNode.java:104)
at org.apache.velocity.runtime.parser.node.ASTExpression.evaluate(ASTExpression.java:62)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:85)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336)
at org.apache.velocity.Template.merge(Template.java:328)
at org.apache.velocity.Template.merge(Template.java:235)
at org.apache.velocity.tools.view.servlet.VelocityViewServlet.performMerge(VelocityViewServlet.java:805)
at org.apache.velocity.tools.view.servlet.VelocityViewServlet.mergeTemplate(VelocityViewServlet.java:762)
at org.apache.velocity.tools.view.servlet.VelocityViewServlet.doRequest(VelocityViewServlet.java:555)
at org.apache.velocity.tools.view.servlet.VelocityViewServlet.doGet(VelocityViewServlet.java:509)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:527)
at org.sakaiproject.vm.VmServlet.includeVm(VmServlet.java:162)
at org.sakaiproject.cheftool.VelocityPortletPaneledAction.toolModeDispatch(VelocityPortletPaneledAction.java:454)
at org.sakaiproject.cheftool.ToolServlet.doGet(ToolServlet.java:234)
at org.sakaiproject.cheftool.VelocityPortletPaneledAction.doGet(VelocityPortletPaneledAction.java:1152)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.sakaiproject.vm.ComponentServlet.service(ComponentServlet.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
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:418)
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:728)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:470)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:356)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316)
at org.sakaiproject.tool.impl.ActiveToolComponent$MyActiveTool.forward(ActiveToolComponent.java:513)
at org.sakaiproject.portal.charon.SkinnableCharonPortal.forwardTool(SkinnableCharonPortal.java:1488)
at org.sakaiproject.portal.charon.handlers.SiteHandler.doToolBuffer(SiteHandler.java:1227)
at org.sakaiproject.portal.charon.handlers.SiteHandler.bufferContent(SiteHandler.java:1061)
at org.sakaiproject.portal.charon.handlers.SiteHandler.doSite(SiteHandler.java:490)
at org.sakaiproject.portal.charon.handlers.SiteHandler.doGet(SiteHandler.java:266)
at org.sakaiproject.portal.charon.handlers.SiteHandler.doGet(SiteHandler.java:154)
at org.sakaiproject.portal.charon.SkinnableCharonPortal.doGet(SkinnableCharonPortal.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
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:467)
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:52)
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:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
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: java.lang.NullPointerException
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:716)
at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:282)
at org.hibernate.collection.internal.PersistentSet.initializeFromCache(PersistentSet.java:145)
at org.hibernate.cache.spi.entry.CollectionCacheEntry.assemble(CollectionCacheEntry.java:75)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.initializeCollectionFromCache(DefaultInitializeCollectionEventListener.java:160)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:76)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1933)
at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:559)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:261)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:555)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:143)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:316)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at org.sakaiproject.assignment.api.model.Assignment.toString(Assignment.java:93)
at org.apache.velocity.runtime.parser.node.ASTReference.evaluate(ASTReference.java:487)
... 70 more
Теперь, я так понимаю, первый журнал ошибок произошел из-за сброса сеанса на полпути, поэтому некоторые переменные в файле VM отсутствуют, но моя проблема в спящем режиме ...
Сущность сохраняется:
@Override
@Transactional
public void saveMarkerSetup(String context, String markerUserID, double quota, String modifier, Assignment assignmentID, Instant dateCreated) {
EntityClass entity = new EntityClass ();
entity.setContext(context);
entity.setDateCreated(dateCreated);
entity.setMarkerUserId(markerUserID);
entity.setQuotaPercentage(quota);
entity.setAssignment(assignmentID);
sessionFactory.getCurrentSession().persist(entity);
}
Класс сущности:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "ASN_MARKER_T")
@Data
@NoArgsConstructor
@EqualsAndHashCode(of = "id")
public class EntityClass {
@Id
@Column(name = "MARKER_ID", length = 36, nullable = false)
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;
@Column(name = "MARKER_USER_ID", nullable = false)
private String markerUserId;
@Column(name = "CONTEXT", length = 99, nullable = false)
private String context;
@ManyToOne
@JoinColumn(name = "ASSIGNMENT_ID")
private Assignment assignment;
@Column(name = "QUOTA_PERCENTAGE")
private Double quotaPercentage;
@Column(name = "ORDER_NUM")
private Integer orderNumber;
@Column(name = "NUM_ALLOC")
private Integer numberAllocated;
@Column(name = "NUM_UPLOADED")
private Integer numberUploaded;
@Type(type = "org.sakaiproject.springframework.orm.hibernate.type.InstantType")
@Column(name = "CREATED_DATE", nullable = false)
private Instant dateCreated;
@Type(type = "org.sakaiproject.springframework.orm.hibernate.type.InstantType")
@Column(name = "MODIFIED_DATE")
private Instant dateModified;
@Column(name = "MODIFIER", length = 99)
private String modifier;
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@OneToMany(mappedBy = "assignmentMarker", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<AssignmentSubmissionMarker> submissionMarkers = new HashSet<>();
}