当前位置: 首页 > 知识库问答 >
问题:

无法保存Spring表单选择标记中的外键

王岳
2023-03-14

我试图保存一个表单,该表单在选择标记中有一个外键,但它总是为空。当我使用inspect元素时,它会发布选定的id,所以我不能说这是表单的问题。有人能帮忙吗。形式

   <form:select path="categoryId">
            <form:option value="0" label="   -- Please Select --" />
            <form:options items="${categoryList}"  itemValue="categoryId" itemLabel="categoryName"/>
    </form:select>

控制器

@RequestMapping(value = "product", method = RequestMethod.POST)
public String addNewProduct(@ModelAttribute("product") Product product, Model model){
    model.addAttribute("product", product);
    purchaseOrderService.addProduct(product);
    return "categories";
}
@Transactional(propagation = Propagation.REQUIRED)
    public boolean saveProduct(Product product) {
        EntityManager em = getEm();
        em.persist(product);
        return true;
    }
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "CATEGORY_ID", referencedColumnName = "CATEGORY_ID")
private Category categoryId;
java.lang.NoClassDefFoundError: org/hibernate/exception/LockTimeoutException
org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1328)
org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80)
org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:394)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy34.addProduct(Unknown Source)
com.logicalideas.purchaseorder.ProductController.addNewProduct(ProductController.java:30)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

根本原因

java.lang.ClassNotFoundException:org.hibernate.exception.locktimeoutException org.apache.catalina.loader.webappClassLoader.loadClass(webappClassLoader.java:1711)org.apache.catalina.loader.webappClassLoader.loadClass(webappClassLoader.java:1556)org.hibernate.ejb.AbstractEntityManagerImpl.Convert(patransactionManager.doCommit(jpatransactionManager.java:512)org.springframework.transaction.support.abstractplatformTransactionManager.processCommit(abstractplatformTransactionManager.java:754)org.springframework.transaction.support.abstractplatformTransactionManager.java:754)org.springframework.transaction.support.abstractplatransaction.interceptor.transactioninterceptor.invoke(transactioninterceptor.java:120)org.springframework.aop.framework.reflectiveMethodInvocation.proce(reflectiveMethodInvocation.java:172)org.springframework.aop.framework.jdkdynamicaopProxy.invoke(jdkdynamicaopProxy.jva:172)org.springframework.aop.framewEmethodAccessorImpl.java:57)sun.reflect.delegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:601)org.springframework.web.Method.support.invocablehandlermethod.invoke(invocablehandlermethod.invoke(invocablehandlermethod.java:213)tinvocableHandlerMethod.java:96)org.springframework.web.servlet.mvc.method.annotation.requestMappingGhandlerAdapter.invokeHandlerMethod(requestMappingGhandlerAdapter.java:617)org.springframework.web.servlet.mvc.methodmapper.web.servlet.method.annotation.method.annotation.reg.springframework.web.servlet.methodmapperAdapter.let.java:923)org.springframework.web.servlet.dispatcherservlet.doService(dispatcherservlet.java:852)org.springframework.web.servlet.frameworkservlet.processRequest(frameworkservlet.java:882)org.springframework.web.servlet.frameworkservlet.processRequest(

多谢

共有1个答案

从开济
2023-03-14

当您解决第一个问题(ClassNotFound)时,我认为现在已经可以了。

关于你的第二个问题:

好吧,这已经消除了错误,但它现在有一个奇怪的行为,它创建了一个新的类别,即使你我在产品控制器中,并试图保存一个新的产品与选定的类别(FK)。然后,它将这个新创建的categoryIdhtml" target="_blank">添加到Product.categoryId中,它与您选择的categoryId(名称,而不是id)是重复的。我真的希望我没有迷惑任何人。我真的很感激。

这不是同一个问题。我想你误解了Hibernate的工作方式。在本例中,当您让Spring机制映射对象时,它将始终创建一个新的categoryId对象。另一方面,通过另一种方法,您可能能够让Spring理解它们是相同的,但在尝试编辑类别时会遇到麻烦。

这里的问题是,您依赖Spring来映射正确的Hibernate对象--Spring映射并不总是好的。相反,我认为您可以向服务器发送类似于“IDOFCategory”的参数,通过该id获取CategoryId对象,然后将类别设置为新创建的产品。更好的方法是只从客户端传输一个DTO对象(ProductDTO),然后在服务器端创建一个完整的Hibernate产品对象。

例如:

@RequestMapping(value = "product", method = RequestMethod.POST)
public String addNewProduct(@ModelAttribute("productDTO") ProductDTO productDTO, Model model){
    model.addAttribute("product", product);
    Product product = new Product(productDTO);
    CategoryId id = productService.getCategoryById(productDTO.getCategoryId());
    product.setCategoryId(id);
    purchaseOrderService.addProduct(product);
    return "categories";
}
 类似资料:
  • 在这里,我可以绑定多选择的选择列表。当我试图保存时,我没有得到一个错误,但它没有保存官员信息。 下面是试图加载页面时出现的错误 处理请求时发生未处理的异常。SQLException:无效的列名'OfficerID'。Microsoft.data.sqlclient.sqlCommand+<>c.b__164_0(任务结果)

  • 这看起来很简单,但我没有找到答案。 我有一个基本的的值没有改变,我也希望知道用户选择了一些东西并重新触发整个处理。所以可能不是我想要使用的,但我没有找到该使用什么。 有一个基本的select标记和一些选项在里面,这是可能的吗?如果不是,实现这一目标的最佳方法可能是什么?(我懒惰的手指宁愿实现一个自定义的React下拉列表,仅作为最后的手段)。 谢谢你们!

  • 我有这个问题。将其从sql查询转换为hql。我有以下错误“意外标记:(靠近第2行第列)” 我不知道怎么了

  • 我正在使用Selenium Webdriver选中表单中的一个框,并在同一页面上单击save。复选框工作正常,但无法单击保存。我已经尝试了多种解决方案,但没有一个有效的解决方案。我添加了一个睡眠,因为在单击手动保存后,它确实需要一段时间来处理。 下面是保存按钮的html: 我也尝试使用webforms,但是我遇到了相反的问题,我可以保存表单,但不能选择复选框。

  • 主要的问题是,如何更新表单中选择的几个字段。我想让用户选择他们想要更新的字段。例如,我有form类: 之后,我将在类中设置字段,例如,如果用户只想更改他们的名称和姓氏,我将通过方法从现有的中获取其余的字段,然后更改一些字段并将更改的对象保存到数据库中。

  • 你可以在这个步骤设置导出的文件名和路径。 勾选你想导出的对象名旁的框。如果在对象窗格高亮显示了现有的表,它将会被自动勾选并指定一个默认的文件名和位置。“导出到”文本框内的扩展名会根据在第一步选择的导出类型而改变。 【注意】导出查询结果时,请确保在运行导出向导前保存查询。否则,这里不会显示源对象。 全选按钮 描述 全选或取消全选 选择或取消选择全部源对象。 导出已选择的到相同文件 导出已选择的表到相