[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요. 상품 주문 Submit 시 오류가 발생하여 문의드립니다. 오류를 살펴보니, CASCDAE와 관련된 오류라고 하더라구요.. 기존 Order 도메인 클래스의 member 부분이 이렇게 선언이 되어 있었는데 @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; 오류를 보고 나서 cascade = CascadeType.ALL 옵션을 추가해주니까 오류 없이 동작을 하긴 하는데 이게 맞나 싶어서 문의드립니다.. @ManyToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "member_id") private Member member; 발생 오류입니다. 인텔리제이 콘솔에 찍힌 로그이고요.. org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member at org.hibernate.engine.spi.CascadingActions$8.noCascade(CascadingActions.java:379) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:169) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:159) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:149) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:82) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1407) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:489) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3303) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2438) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:449) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ~[spring-orm-5.3.27.jar:5.3.27] at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) ~[spring-tx-5.3.27.jar:5.3.27] at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) ~[spring-tx-5.3.27.jar:5.3.27] at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) ~[spring-tx-5.3.27.jar:5.3.27] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) ~[spring-tx-5.3.27.jar:5.3.27] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.27.jar:5.3.27] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.27.jar:5.3.27] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.27.jar:5.3.27] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.27.jar:5.3.27] at jpabook.jpashop.service.OrderService$$EnhancerBySpringCGLIB$$c3aef6ec.order(<generated>) ~[classes/:na] at jpabook.jpashop.controller.OrderController.order(OrderController.java:42) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.27.jar:5.3.27] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.27.jar:5.3.27] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.27.jar:5.3.27] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.27.jar:5.3.27] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.27.jar:5.3.27] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.27.jar:5.3.27] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.27.jar:5.3.27] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.27.jar:5.3.27] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.27.jar:5.3.27] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.27.jar:5.3.27] at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.74.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.27.jar:5.3.27] at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.74.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.74.jar:9.0.74] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.27.jar:5.3.27] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.27.jar:5.3.27] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.27.jar:5.3.27] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.27.jar:5.3.27] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.27.jar:5.3.27] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.27.jar:5.3.27] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.74.jar:9.0.74] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na] 웹 브라우저에 출력된 에러 페이지입니다. Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue May 23 16:25:07 KST 2023 There was an unexpected error (type=Internal Server Error, status=500). org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible( EntityManagerFactoryUtils.java:371 ) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible( HibernateJpaDialect.java:235 ) at org.springframework.orm.jpa.JpaTransactionManager.doCommit( JpaTransactionManager.java:566 ) at org.springframework.transaction.support .AbstractPlatformTransactionManager.processCommit( AbstractPlatformTransactionManager.java:743 ) at org.springframework.transaction.support .AbstractPlatformTransactionManager.commit( AbstractPlatformTransactionManager.java:711 ) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning( TransactionAspectSupport.java:654 ) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction( TransactionAspectSupport.java:407 ) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke( TransactionInterceptor.java:119 ) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed( ReflectiveMethodInvocation.java:186 ) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed( CglibAopProxy.java:763 ) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept( CglibAopProxy.java:708 ) at jpabook.jpashop.service.OrderService$$EnhancerBySpringCGLIB$$c3aef6ec.order(<generated>) at jpabook.jpashop.controller.OrderController.order( OrderController.java:42 ) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:62 ) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43 ) at java.base/java.lang.reflect.Method.invoke( Method.java:566 ) at org.springframework.web.method.support .InvocableHandlerMethod.doInvoke( InvocableHandlerMethod.java:205 ) at org.springframework.web.method.support .InvocableHandlerMethod.invokeForRequest( InvocableHandlerMethod.java:150 ) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle( ServletInvocableHandlerMethod.java:117 ) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod( RequestMappingHandlerAdapter.java:895 ) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal( RequestMappingHandlerAdapter.java:808 ) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle( AbstractHandlerMethodAdapter.java:87 ) at org.springframework.web.servlet.DispatcherServlet.doDispatch( DispatcherServlet.java:1072 ) at org.springframework.web.servlet.DispatcherServlet.doService( DispatcherServlet.java:965 ) at org.springframework.web.servlet.FrameworkServlet.processRequest( FrameworkServlet.java:1006 ) at org.springframework.web.servlet.FrameworkServlet.doPost( FrameworkServlet.java:909 ) at javax.servlet.http.HttpServlet.service( HttpServlet.java:555 ) at org.springframework.web.servlet.FrameworkServlet.service( FrameworkServlet.java:883 ) at javax.servlet.http.HttpServlet.service( HttpServlet.java:623 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:209 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:153 ) at org.apache.tomcat.websocket.server.WsFilter.doFilter( WsFilter.java:51 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:178 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:153 ) at org.springframework.web.filter.RequestContextFilter.doFilterInternal( RequestContextFilter.java:100 ) at org.springframework.web.filter.OncePerRequestFilter.doFilter( OncePerRequestFilter.java:117 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:178 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:153 ) at org.springframework.web.filter.FormContentFilter.doFilterInternal( FormContentFilter.java:93 ) at org.springframework.web.filter.OncePerRequestFilter.doFilter( OncePerRequestFilter.java:117 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:178 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:153 ) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal( CharacterEncodingFilter.java:201 ) at org.springframework.web.filter.OncePerRequestFilter.doFilter( OncePerRequestFilter.java:117 ) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:178 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:153 ) at org.apache.catalina.core.StandardWrapperValve.invoke( StandardWrapperValve.java:167 ) at org.apache.catalina.core.StandardContextValve.invoke( StandardContextValve.java:90 ) at org.apache.catalina.authenticator.AuthenticatorBase.invoke( AuthenticatorBase.java:481 ) at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:130 ) at org.apache.catalina.valves.ErrorReportValve.invoke( ErrorReportValve.java:93 ) 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:389 ) at org.apache.coyote.AbstractProcessorLight.process( AbstractProcessorLight.java:63 ) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process( AbstractProtocol.java:926 ) at org.apache.tomcat.util.net .NioEndpoint$SocketProcessor.doRun( NioEndpoint.java:1791 ) at org.apache.tomcat.util.net.SocketProcessorBase.run ( SocketProcessorBase.java:52 ) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1191 ) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:659 ) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run( TaskThread.java:61 ) at java.base/java.lang.Thread.run( Thread.java:834 ) Caused by: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member at org.hibernate.internal.ExceptionConverterImpl.convert( ExceptionConverterImpl.java:151 ) at org.hibernate.internal.ExceptionConverterImpl.convert( ExceptionConverterImpl.java:181 ) at org.hibernate.internal.ExceptionConverterImpl.convert( ExceptionConverterImpl.java:188 ) at org.hibernate.internal.SessionImpl.doFlush( SessionImpl.java:1411 ) at org.hibernate.internal.SessionImpl.managedFlush( SessionImpl.java:489 ) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion( SessionImpl.java:3303 ) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion( SessionImpl.java:2438 ) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion( JdbcCoordinatorImpl.java:449 ) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback( JdbcResourceLocalTransactionCoordinatorImpl.java:183 ) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300( JdbcResourceLocalTransactionCoordinatorImpl.java:40 ) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit( JdbcResourceLocalTransactionCoordinatorImpl.java:281 ) at org.hibernate.engine.transaction.internal.TransactionImpl.commit( TransactionImpl.java:101 ) at org.springframework.orm.jpa.JpaTransactionManager.doCommit( JpaTransactionManager.java:562 ) ... 60 more Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : jpabook.jpashop.domain.Order.member -> jpabook.jpashop.domain.Member at org.hibernate.engine.spi.CascadingActions$8.noCascade( CascadingActions.java:379 ) at org.hibernate.engine.internal.Cascade.cascade( Cascade.java:169 ) at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush( AbstractFlushingEventListener.java:159 ) at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes( AbstractFlushingEventListener.java:149 ) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions( AbstractFlushingEventListener.java:82 ) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush( DefaultFlushEventListener.java:39 ) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener( EventListenerGroupImpl.java:107 ) at org.hibernate.internal.SessionImpl.doFlush( SessionImpl.java:1407 ) ... 69 more 작성한 코드도 올려두겠습니다. package jpabook.jpashop.controller; import jpabook.jpashop.domain.Member; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.service.ItemService; import jpabook.jpashop.service.MemberService; import jpabook.jpashop.service.OrderService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @Controller @RequiredArgsConstructor public class OrderController { private final OrderService orderService; private final MemberService memberService; private final ItemService itemService; @GetMapping("/order") public String createForm(Model model){ List<Member> members = memberService.findMembers(); List<Item> items = itemService.findItems(); model.addAttribute("members", members); model.addAttribute("items", items); return "order/orderForm"; } @PostMapping("/order") public String order(@RequestParam("memberId") Long memberId, @RequestParam("itemId") Long itemId, @RequestParam("count") int count){ orderService.order(memberId, itemId, count); return "redirect:/orders"; } } package jpabook.jpashop.service; import jpabook.jpashop.domain.Delivery; import jpabook.jpashop.domain.Member; import jpabook.jpashop.domain.Order; import jpabook.jpashop.domain.OrderItem; import jpabook.jpashop.domain.item.Item; import jpabook.jpashop.repository.ItemRepository; import jpabook.jpashop.repository.MemberRepository; import jpabook.jpashop.repository.OrderRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class OrderService { private final OrderRepository orderRepository; private final MemberRepository memberRepository; private final ItemRepository itemRepository; //주문 @Transactional public Long order(Long memberId, Long itemId, int count){ /* 엔티티 조회 */ //회원 조회 Member member = memberRepository.findOne(memberId); //상품 조회 Item item = itemRepository.findOne(itemId); //배송정보 생성 Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); //주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count); //주문 생성 Order order = Order.createOrder(member, delivery, orderItem); //주문 저장 orderRepository.save(order); //주문 식별자 반환 (ID) return order.getId(); } //주문 취소 @Transactional public void cancelOrder(Long orderId){ // 주문 엔티티 조회 Order order = orderRepository.findOne(orderId); //주문 취소 order.cancel(); } /*//검색 public List<Order> findOrders(OrderSearch orderSearch){ return orderRepository.findAll(orderSearch); }*/ } package jpabook.jpashop.domain; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.aspectj.weaver.ast.Or; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import static javax.persistence.FetchType.LAZY; @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] //== 연관관계 메서드 ==/ //== 양방향 연관관계에서의 편의 메서드 ==/ public void setMember(Member member){ this.member = new Member(); member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem){ orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery){ this.delivery = delivery; delivery.setOrder(this); } //==생성 메서드==// public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems){ Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems){ order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } //==비즈니스 로직==// /* * 주문 취소 * */ public void cancel(){ if(delivery.getStatus() == DeliveryStatus.COMP){ throw new IllegalStateException("이미 배송 완료된 상품은 취소가 불가능합니다."); } this.setStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItems){ orderItem.cancel(); } } //==조회 로직==// /** * 전체 주문 가격 조회 */ public int getTotalPrice(){ int totalPrice = 0; for (OrderItem orderItem : orderItems){ totalPrice += orderItem.getTotalPrice(); } return totalPrice; } } package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); }
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
안녕하세요, 강사님. 컨트롤러 코드 관련 질문입니다. 작성한 코드는 컨트롤러의 메소드 반환 타입을 void로 해서 아무것도 반환하지 않는데요, 만약 postmapping 관련 메소드 작성 시, 작성한 게시글의 id값을 반환해주는 코드와 큰 차이가 있을까요? 그리고 찾아보던 중, ResponseEntity를 사용해서 반환해주는 메소드를 보았는데, 메소드의 반환 타입에 따라 기능에 큰 차이가 있는지, 아니면 API 명세의 차이만 있고 기능에는 크게 차이가 없는지 궁금합니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 본 강의 마지막 부분에 연관관계 편의 메서드를 만드는 부분이 있는데, 필드에 직접 접근하여 설정하는 내용이 있습니다. 예를들어 this.child.add(child); this.member = member; 와 같은 코드들이 문제가 되지는 않겠지만 유지보수 측면에서 안 좋은 영향을 끼치는 것 같아서 this.getChild().add(child); this.setMember(member); 와 같이 리팩토링하는 것이 좋지 않나 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요. 강의를 한 번 완주한 후 개별적으로 예제와 다르게 다시 공부하고 있는데 오류가 나서요..ㅜㅜ https://drive.google.com/file/d/1Fe9hZbwSCKFYyQtmj_TU2Sl9VwqeXCsO/view?usp=sharing 무엇 때문에 오류가 났는지 알 수 있을까요??
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] Team team = new Team(); team.setName("TeamA"); System.out.println("team.getId = " + team.getId()); em.persist(team); System.out.println("team.getId = " + team.getId()); //이 부분이 궁금합니다 db에 넣질 않아서 id 값이 생성이 안되었을텐데 어떻게 id값을 가져오는건가요? 여기서 보면 em.persist 이전에 시도한 team.getId는 null값이 나오는데 (team.getId = null) persist 이후에 시도한 team.getId는 값을 얻을 수 있었습니다. (team.getId = 1) 영속성 컨텍스트에만 넣고 db에 commit은 하지 않았기에 id값이 아직 생성조차 안되었을텐데 어떻게 아이디 값이 나오는지 궁금합니다.
영속성 컨텍스트 부분을 공부하다가 의문이 생겨 질문 남깁니다. PPT를 보면 '1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공'이라고 나와 있습니다. 그런데 제가 생각하기로는 트랜잭션 커밋을 하기 전까지는 1차 캐시에서만 엔티티를 조회하기 때문에 같은 이유로 팬텀 리드 현상도 일어나지 않을 것 같습니다. 팬텀 리드 현상이 일어나지 않는다고 가정할 때, 팬텀 리드 현상이 일어나지 않음에도 불구하고 SERIALIZABLE 등급이 아닌 REPEATABLE READ 등급의 트랜잭션 격리 수준을 제공한다고 표현한 이유는 팬텀 리드 현상이 일어나지 않지만 SERIALIZABLE은 아닌 예시가 존재하기 때문일까요? 즉, 제가 SERIALIZABLE 레벨을 단순히 'Dirty Read, Non-repeatable read, Phantom read 현상이 발생하지 않는 레벨'로 이해하고 있는게 잘못된 걸까요?
private BooleanExpression checkActivityContainsGeneration(Integer generation) { if(generation == null) return null; return QMemberActivity.memberActivity.generaition.eq(generation); } 이렇게 전체 멤버를 조회할때, 해당 generation 값을 가져오는 boolean expression을 조회했습니다. 하지만, generation 을 이용한 정렬을 할때에는, 해당 userid를 가진 모든 generation 컬럼을 가져와야하는데, 위의 조건처럼 조건을 준다면 해당 generation 컬럼만 가져와서 정렬이 제대로 되지 않더라구요! 제가 원하는건 return QMemberActivity.memberActivity.memberId.eq( select memberId from QMemberActivity.memberActivity where QMemberActivity.memberActivity.generation.eq(generation) ); 과 같이 generation이 같은 컬럼의 memberId를 가져오는 것인데, booleanexpression으로 다른 컬럼 값을 return하려면 subquery를 작성하는 것 뿐일까요?
MemberTest에서 changeTeam메소드를 테스트 해보고 싶어서 추가로 코딩해서 실행해보았습니다. 근데 System.out.println(member1.getTeam().getName()); System.out.println(teamB.getMembers().stream().collect(Collectors.toList())); 위의 코드에는 반영이 되는 데 h2에 select문으로 member를 쿼리해보면 반영이 안되어있더라구요. 제가 공부한바로는 em.flush(), em.close 하면 db에 반영되는 걸로 이해하고 있는데... 잘못이해하고 있는 건가요??
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 현재 인텔리제이에서는 뭔가 잘 된 것처럼 나오고 있지만 h2 에서는 엔티티가 적용이 안 되는 상태입니다 . 위 그림처럼 제대로 잘 적용이 되어 보이지만 코드를 실행하고 난 다음의 h2는 이렇게 어떤 엔티티도 적용이 되지 않은 모습입니다. 코드는 정말 강의 보고 똑같이 따라 쳤습니다..ㅠㅠ 실행시켰을 때는 콘솔 창이 이런 문구들이 뜹니다. /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58478:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/imjeong-u/Downloads/jpashop/target/classes:/Users/imjeong-u/.m2/repository/org/hibernate/hibernate-entitymanager/5.3.10.Final/hibernate-entitymanager-5.3.10.Final.jar:/Users/imjeong-u/.m2/repository/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/Users/imjeong-u/.m2/repository/org/hibernate/hibernate-core/5.3.10.Final/hibernate-core-5.3.10.Final.jar:/Users/imjeong-u/.m2/repository/org/javassist/javassist/3.23.2-GA/javassist-3.23.2-GA.jar:/Users/imjeong-u/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/imjeong-u/.m2/repository/org/jboss/jandex/2.0.5.Final/jandex-2.0.5.Final.jar:/Users/imjeong-u/.m2/repository/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/Users/imjeong-u/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/Users/imjeong-u/.m2/repository/org/dom4j/dom4j/2.1.1/dom4j-2.1.1.jar:/Users/imjeong-u/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.0.4.Final/hibernate-commons-annotations-5.0.4.Final.jar:/Users/imjeong-u/.m2/repository/javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar:/Users/imjeong-u/.m2/repository/net/bytebuddy/byte-buddy/1.9.5/byte-buddy-1.9.5.jar:/Users/imjeong-u/.m2/repository/org/jboss/spec/javax/transaction/jboss-transaction-api_1.2_spec/1.1.1.Final/jboss-transaction-api_1.2_spec-1.1.1.Final.jar:/Users/imjeong-u/.m2/repository/com/h2database/h2/1.4.199/h2-1.4.199.jar:/Users/imjeong-u/.m2/repository/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar jpabook.Main 5월 22, 2023 4:27:50 오전 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...] 5월 22, 2023 4:27:50 오전 org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core { 5.3.10.Final } 5월 22, 2023 4:27:50 오전 org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found 5월 22, 2023 4:27:50 오전 org.hibernate.annotations.common.reflection.java .JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations { 5.0.4.Final } 5월 22, 2023 4:27:50 오전 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) 5월 22, 2023 4:27:50 오전 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp:// localhost/~/jpashop ] 5월 22, 2023 4:27:50 오전 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {user=sa} 5월 22, 2023 4:27:50 오전 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false 5월 22, 2023 4:27:50 오전 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH000115: Hibernate connection pool size: 20 (min=1) 5월 22, 2023 4:27:50 오전 org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 5월 22, 2023 4:27:51 오전 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp:// localhost/~/jpashop ] Process finished with exit code 0 쿼리 문이 안 나오는걸 봐서는 잘 안되고 있긴 합니다.. 근데 어디서 문제인지 잘 모르겠습니다 정말 도저히 모르겠습니다... 몇 시간째 보고 있는지도 모르겠습니다.. 너무 스트레스네욤..ㅠㅠ
안녕하세요. 전 현재 queryDSL 강의까지 듣고 몇달간 프로젝트를 진행중인 학생입니다. 이번에 맞닥뜨리게된 문제가 특이해서 질문 남겨봅니다. 다름이 아니라 CascadeType을 지정하지 않은 상태에서 데이터를 DB에 저장했었습니다. 당시엔 flag를 통한 delete를 기능에 담아내고 있었기 때문입니다. 하지만 시간이 흘러 delete를 해야할 타이밍이 와서 기능을 구현하는데 의존성 때문에 부모 객체가 삭제될 수 없다며 Connection org.postgresql.jdbc.PgConnection@37333b1f marked as broken because of SQLSTATE(08006), ErrorCode(0) 에러가 나며 에러를 띄웠습니다. 아무리 찾아봐도 CascadeType을 통해 JPA에서 영속 상태를 정한다고만 하고 Bard, ChatGpt, Bing 등 비슷한 답을 줬습니다. 서비스 전의 DB라 DB에 있던 튜플들을 전부 삭제하는 것으로 해결했으나 궁금증은 여전히 해결되지 않았습니다. CascadeType을 지정하지 않았을 때 저장된 값은 CascadeType.ALL로 바꿨을 때도 영속상태로 들어가질 않나요? 만약 그렇다면 해당 값이 어떻게 CascadeType이 지정되기 전에 저장됐는지 아닌지 알 수 있는 건가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 실전!스프링부트와 JPA활용 1편 - 엔티티클래스개발2 수업 18:46초 가량에서 선생님이 jpa가 자동으로 만들어내는 DDL을 그대로 사용하면 안되고 스크립트를 뽑아내서 가다듬고 사용한다고 말씀해주셨는데요 가다듬는 과정에는 구체적으로 어떤 행위가 있는지 궁금합니다
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 실전! 스프링부트와 JPA활용 수업 - 엔티티 클래스 개발1편 강의에서 28:21에 나오는 회원 테이블 그림입니다 여기서 order 테이블과 delivery 테이블이 1:1 관계를 맺고 있는데요 저는 order테이블과 delivery 테이블이 1:1이 아니라 일대다 관계여야하는거 아닌가하는 질문이 생겨서요. 왜냐하면 하나의 주문은 하나의 배달상태를 가지지만 하나의 배달상태는 여러 주문과 연결되잖아요. 혹시 제가 놓치고 있는 부분 있으면 말해주시면 감사하겠습니다
안녕하세요 공부를 하던 중에 궁금한 점이 생겼습니다. 제가 간단한 회원정보를 스프링 데이터 jpa로 저장을 했는데 그 후에 db에서 직접 값을 바꾸고 조회하니 당연히 영속성 컨텍스트에 있는 부분과 동기화가 안되어 원하는 값이 조회가 안됐습니다. 이런 경우에 바뀐 값을 조회하려면 memberservice 혹은 JpaRepostory를 상속받은 memberRepository에서 영속성 컨텍스트를 clear로 한 번 지워야 할 것 같은데 어떻게 해야 할지 잘 모르겠습니다.
안녕하십니까 호돌맨님 교육 강의를 듣고있는 학생입니다. 다름이 아니라 도저히 구글링을 해봐도 해결책을 찾지 못해서 질문 남깁니다. PostEditor Service -> edit method PostEntity Error Spring REST Docs1 - 기본설정 챕터에서 30분 정도에 호돌맨님이 Gradle 에 build 버튼을 누르시는데 거기서 querydsl compile 과 관련된 에러가 납니다. 내용을 보면 PostEditor 에서 PostEditorBuilder 심볼을 찾지 못한다고 에러가 발생하는데 Q파일 생성 문제인거 같은데 구글링을 해봐도 문제해결을 하지 못하였습니다. 호돌맨님이 작성하신 코드랑 제가 다르게 작성한 코드 부분는 그냥 PostEditor 자체에서 static 으로callEditor 를 호출해서 PostEdit 파라미터로 받아서 값을 셋팅하고 Post 엔티티에 넘겨주는 방식으로 수정해 봤습니다. git url : https://github.com/ilikeamoney/inflearn-hodolman
안녕하세요. 강의를 통해서 많은 도움을 받고 있습니다. 궁금한 내용은 외래키가 없는 경우의 데이터 조회입니다. 예를 들어서 <주문> 할 때에 <회원 정보>를 외래키로 넣으면 문제가 없는데... 비회원 주문을 할 경우에는 <주문> 테이블에 들어갈 회원 컬럼에 null 값이 들어가게 됩니다. 그러면 조회할 때 아주 조회가 안되는 문제가 있더라구요. 실행되는 퀴리를 보면 inner join으로 나옵니다. 예상에는 left join 하는 것처럼 빈 칸으로 나오리라 생각하는데 말이죠. 이럴 경우에는 어떻게 해야 할까요? 어떻게 해야지 비회원 주문과 같이 외래키가 없는 경우에도 조회 할 수 있을까요?