2016-03-30 2 views
1

EDIT: пробовали в течение нескольких часов, но до сих пор не нашли решения.Копия объекта была назначена другой сущности (весна/спящий режим)

Сейчас у меня есть 3 стола в моей базе данных - Booking, Restaurant and RestaurantTable. У меня есть сопоставление от одного до многих между Рестораном и Рестораном (в ресторане может быть много столов, но на столе может быть только один ресторан). У меня есть файл под названием «newTable.jsp», который вставляет новые таблицы в ресторан. Но когда я пытаюсь вставить таблицу, это дает мне ошибку, говоря, что копия сущности уже была назначена другому объекту.

@Entity 
@Table(name="restaurant") 
public class Restaurant { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="restaurant_name") 
    private String restaurantName; 

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

    @OneToMany(mappedBy="restaurant", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<RestaurantTable> table; 

    // Getters and setters 

Мой "RestaurantTable.java":

@Entity 
@Table(name="restaurant_table") 
public class RestaurantTable { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="table_size") 
    private int tableSize; 

    @Column(name="table_number") 
    private int tableNumber; 

    @ManyToOne 
    @JoinColumn(name="restaurant_id") 
    private Restaurant restaurant; 

    // Getters and setters 

Мой "newTable.jsp"

<body> 
<jsp:include page="../fragments/menu.jsp"/> 
<div id="body"> 
    <section class="content-wrapper main-content clear-fix"> 

     <h2>Add New Table</h2> 

     <form:form method="POST" commandName="table" modelAttribute="table"> 
      <table> 
       <tr> 
        <td>Table size:</td> 
        <td><form:input path="tableSize" /></td> 
       </tr> 
       <tr> 
        <td>Table number:</td> 
        <td><form:input path="tableNumber" /></td> 
       </tr> 
       <tr> 
        <td colspan="3"><input type="submit" /> 
        </td> 
       </tr> 
      </table> 
     </form:form> 

    </section> 
</div> 
<jsp:include page="../fragments/footer.jsp"/> 

</body> 

Мой RestaurantTableController:

@Controller 
public class RestaurantTableController { 


    @Autowired 
    private RestaurantService restaurantService; 

    @Autowired 
    private RestaurantTableService restaurantTableService; 

    @RequestMapping(value="restaurant/table/{id}", method = RequestMethod.GET) 
    public String addRestaurantTable(Model model) { 
     model.addAttribute("table", new RestaurantTable()); 
     return "newTable"; 
    } 

    @RequestMapping(value = "restaurant/table/{id}", method = RequestMethod.POST) 
    public String addRestaurantTable(@PathVariable Long id, @ModelAttribute ("table") RestaurantTable table) { 
     // Get a Restaurant object and add the table to it. 
     Restaurant restaurant = restaurantService.getRestaurant(id); 
     table.setRestaurant(restaurant); 
     Set<RestaurantTable> tableSet = restaurant.getTable(); 
     tableSet.add(table); 
     restaurant.setTable(tableSet); 
     restaurantService.updateRestaurant(restaurant); 
     return "editRestaurant"; 
    } 

} 

{ID} в RestaurantTableController это идентификатор ресторана, это перешел от "editRestaurant.jsp".

Мой метод updateRestaurant:

@Override 
public void updateRestaurant(Restaurant restaurant) { 
    Session session = this.sessionFactory.getCurrentSession(); 
    session.merge(restaurant); 
    logger.info("Restaurant record updated successfully, Restaurant Details=" + restaurant); 
} 

Любая помощь приветствуется!

EDIT: Добавлено «table.setRestaurant (ресторан)»; к RestaurantTableController. Это теперь позволяет мне добавить одну таблицу, но когда я пытаюсь добавить еще один он дает мне эту ошибку:

30-Mar-2016 16:59:59.363 SEVERE [http-nio-8080-exec-3] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Error occurred while storing entity [Table number 0]. An entity copy [ee.helmes.bootcamp.model.RestaurantTable#6] was already assigned to a different entity [Table number 0].] with root cause 
java.lang.IllegalStateException: Error occurred while storing entity [Table number 0]. An entity copy [ee.helmes.bootcamp.model.RestaurantTable#6] was already assigned to a different entity [Table number 0]. 
    at org.hibernate.event.internal.EventCache.put(EventCache.java:192) 
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:285) 
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151) 
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:886) 
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:868) 
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:277) 
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161) 
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:379) 
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:319) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:296) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161) 
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118) 
    at org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:439) 
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:308) 
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151) 
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76) 
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:876) 
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:858) 
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:863) 
    at ee.helmes.bootcamp.dao.RestaurantDaoImpl.updateRestaurant(RestaurantDaoImpl.java:31) 
    at ee.helmes.bootcamp.service.RestaurantServiceImpl.updateRestaurant(RestaurantServiceImpl.java:26) 
    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:497) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy34.updateRestaurant(Unknown Source) 
    at ee.helmes.bootcamp.controller.RestaurantTableController.addRestaurantTable(RestaurantTableController.java:40) 
    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:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    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:749) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Моя база данных выглядит следующим образом:

DROP TABLE IF EXISTS `restaurant`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `restaurant` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `restaurant_name` TEXT, 
    `address` TEXT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

DROP TABLE IF EXISTS `restaurant_table`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `restaurant_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `table_size` int, 
    `table_number` int, 
    `restaurant_id` int(11), 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`restaurant_id`) references `restaurant`(`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 
+0

Накачка вопроса путем добавления «не решена» не приветствуется здесь. Это не форум, пожалуйста, имейте это в виду. – Tom

ответ

1

Вы забыли инициализировать сторону владельца ассоциации, которая является единственным Hibernate, хочет знать, существует ли ассоциация:

table.setRestaurant(restaurant); 
+0

Эй, спасибо за ваш ответ! Теперь я могу добавить одну таблицу, но когда я пытаюсь добавить другую таблицу, она дает мне эту ошибку: Копия сущности [ee.helmes.bootcamp.model.RestaurantTable # 6] уже была назначена другой сущности [Номер таблицы 0]. – charliekelly

+0

Я никогда не видел этого сообщения об ошибке. Измените свой вопрос и опубликуйте полную трассировку стека ошибок. –

+0

Я отредактировал свой вопрос и разместил трассировку стека ошибок. – charliekelly

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