Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象引用未保存的瞬态实例-在刷新之前保存瞬态实例(M-1关系)_Java_Spring_Hibernate_Spring Mvc_Transient - Fatal编程技术网

Java 对象引用未保存的瞬态实例-在刷新之前保存瞬态实例(M-1关系)

Java 对象引用未保存的瞬态实例-在刷新之前保存瞬态实例(M-1关系),java,spring,hibernate,spring-mvc,transient,Java,Spring,Hibernate,Spring Mvc,Transient,我知道有很多关于这个异常的帖子,但是我是一个使用spring的初学者。到目前为止,我一直试图解决这个异常,但没有任何结果。我需要你的帮助来解决它 我有一个employee表,其中包含婚姻状况id表的外键多对一关系。 employee表中婚姻状况的外键可以为null,当我尝试插入一名员工而不从UI中的列表中选择婚姻状况时,我得到了以下异常,但如果我从列表中选择婚姻状况,则可以正常工作 org.hibernate.TransientObjectException: object references

我知道有很多关于这个异常的帖子,但是我是一个使用spring的初学者。到目前为止,我一直试图解决这个异常,但没有任何结果。我需要你的帮助来解决它

我有一个employee表,其中包含婚姻状况id表的外键多对一关系。 employee表中婚姻状况的外键可以为null,当我尝试插入一名员工而不从UI中的列表中选择婚姻状况时,我得到了以下异常,但如果我从列表中选择婚姻状况,则可以正常工作

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.nassar.model.MaritalStatus
at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:249)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:489)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:295)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:305)
at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4027)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:527)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:234)
at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:163)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:227)
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1233)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:403)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:554)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270)
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.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy38.add(Unknown Source)
at com.nassar.controller.EmployeeController.addEmployee(EmployeeController.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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:646)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:155)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
员工控制员来源

//////////////////////////////////Employee Controller//////////////////////////////////////
@Controller
@RequestMapping(value="/emp")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    @RequestMapping(value="/add", method=RequestMethod.POST)
    public ModelAndView addEmployee(@ModelAttribute Employee employee){

    // employeeService calls employeeDAO 
    employeeService.add(employee); 

    ModelAndView modelAndView = new ModelAndView("add-emp");

    modelAndView.addObject("department_list", departmentService.listAllDepartment());
    modelAndView.addObject("m_status_list", maritalStatusService.listAllMaritalStatus());

    modelAndView.addObject("employee", new Employee());

    return modelAndView;
}
...
}
员工实体源

//////////////////////    Employee entity    //////////////////////
@Entity
@Table(name="employee")
public class Employee {

     @Id
     @Column(name="pk_id")
     @Basic(optional=false)
     @GeneratedValue(strategy=GenerationType.AUTO)
     private Integer employeeId;
     ...
     @ManyToOne
     @JoinColumn(name="fk_marital_status", referencedColumnName="id")
     private MaritalStatus fkMaritalStatus;
     ...
}
婚姻状况来源

//////////////////////    Marital Status entity    //////////////////////
@Entity
@Table(name = "marital_status")
public class MaritalStatus {

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


     @Basic(optional=false)
     @Column(name="description")
     private String maritalStatusDescription;

     @OneToMany(mappedBy="fkMaritalStatus")
     private List<Employee> employeeList;

}
这是用于使用jsp和spring表单插入员工的表单

<form:form action="${pageContext.request.contextPath}/emp/add"
    method="post" commandName="employee">
    <table title="Add Employee">
        <tr>
            <td>Name</td>
            <td><form:input path="name" /></td>
        </tr>
  ...
        <tr>
            <td>Marital Status</td>
            <td><form:select path="fkMaritalStatus.maritalStatusId" >
                <form:option value="">Select Marital status</form:option>
                <c:forEach items="${m_status_list}" var="m_status">
                    <form:option value="${m_status.maritalStatusId}">${m_status.maritalStatusDescription}</form:option>
                </c:forEach>
                </form:select>
            </td>
        </tr>
 ...

您能否在Employee实体上创建一个toString方法,并在将其保存到数据库之前将其打印出来?是的,我这样做了,并且在我输入Employee实例变量值时,它会正确地打印所有Employee实例变量值。如果未从列表中选择Fk_婚姻_status=null,则在保存之前设置了什么employeeId值?
<form:form action="${pageContext.request.contextPath}/emp/add"
    method="post" commandName="employee">
    <table title="Add Employee">
        <tr>
            <td>Name</td>
            <td><form:input path="name" /></td>
        </tr>
  ...
        <tr>
            <td>Marital Status</td>
            <td><form:select path="fkMaritalStatus.maritalStatusId" >
                <form:option value="">Select Marital status</form:option>
                <c:forEach items="${m_status_list}" var="m_status">
                    <form:option value="${m_status.maritalStatusId}">${m_status.maritalStatusDescription}</form:option>
                </c:forEach>
                </form:select>
            </td>
        </tr>
 ...
if(employee.getFkMaritalStatus().getMaritalStatusId() == null)
        employee.setFkMaritalStatus(null);

session.getCurrentSession().save(employee);