묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
질문드립니다
삭제된 글입니다
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
[SQL Error: 23503] Cascade 설정 후 Parent remove할 때 질문입니다.
안녕하세요! 이전 질문에서 영한님 답변을 받고 원인을 해결하여 다른 경우 또한 테스트해보고 있는데 SQL Error: 23503 에러가 발생했고, 구글링 결과 참조 키 제약조건 위배될 때 발생하는 에러라 하는데 아래 상황에서 왜 이 에러가 뜨는지 모르겠어서 질문을 남깁니다. Parent, child 끼리 연관관계 매핑 후, cascadetype.ALL, orphanRemoval=false로 설정한 후, parent를 삭제할 때 발생한 에러입니다. 먼저 Parent, Child, Main 클래스 코드를 보여드리겠습니다! @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List<Child> children=new ArrayList<>(); public void addChild(Child child){ children.add(child); child.setParent(this); } // getter, setter 생략했습니다 } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) private Parent parent; // getter, setter 메소드 생략했습니다 } Parent 클래스, Child 클래스는 위와 같이 작성했으며, cascadetype.ALL로 설정해놓았고, 고아 객체 제거는 설정하지 않았습니다. 메인 코드는 아래와 같습니다. public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em=emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Parent parent=new Parent(); parent.setName("kth990303"); Child child1=new Child(); child1.setName("kthbaby1"); Child child2=new Child(); child2.setName("kthbaby2"); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); System.out.println("===================1"); findParent.getChildren().remove(0); em.remove(findParent); System.out.println("===================3"); tx.commit(); } catch(Exception e){ e.printStackTrace(); tx.rollback(); } finally{ em.close(); } emf.close(); } } 역시 orphanRemoval=true가 아니었기 때문에 findParent.getChildren().remove(0);코드에서, 아무 일이 일어나지 않고 지연로딩으로 인한 child select 쿼리만 날라가는건 예상대로였는데, 문제는 그 아래 em.remove(findParent); 였습니다. 이미 em.find로 영속성 컨텍스트에 정보가 있어 parent를 지울 때 에러가 발생하지 않은 상태로 parent와 children 모두 지워질 줄 알았는데 아래 사진과 같은 에러가 발생했습니다. 사실 parent를 지울 때 그냥 findParent.getChildren().remove(0); 을 작성하지 않고 em.remove(findParent);만 하면 parent가 지워짐과 동시에 children도 모두 잘 지워지는 성공적인 결과가 보이긴 합니다만,,, 위와 같이 코드를 짠 후 실행했더니 SQL ERROR 23503이 뜨는 이유가 궁금하여 질문드립니다. 금쪽같은 주말에 질문을 좀 많이 하는 듯하네요 ㅠㅠ 죄송합니다. 그리고 감사합니다 :) ===================1 Hibernate: select children0_.parent_id as parent_i3_2_0_, children0_.id as id1_2_0_, children0_.id as id1_2_1_, children0_.name as name2_2_1_, children0_.parent_id as parent_i3_2_1_ from Child children0_ where children0_.parent_id=? ===================3 Hibernate: /* delete hellojpa.Child */ delete from Child where id=? Hibernate: /* delete hellojpa.Parent */ delete from Parent where id=? 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 23503, SQLState: 23503 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: Referential integrity constraint violation: "FKLH67J1N7X7GT59U0PBKWQH6O6: PUBLIC.CHILD FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.PARENT(ID) (1)"; SQL statement: /* delete hellojpa.Parent */ delete from Parent where id=? [23503-199] 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release INFO: HHH000010: On release of batch it still contained JDBC statements javax.persistence.RollbackException: Error while committing the transaction at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:81) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104) at hellojpa.JpaMain.main(JpaMain.java:43) Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:65) ... 2 more Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3551) at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3810) at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:124) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:348) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1352) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:443) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3202) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2370) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447) 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) ... 1 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKLH67J1N7X7GT59U0PBKWQH6O6: PUBLIC.CHILD FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.PARENT(ID) (1)"; SQL statement: /* delete hellojpa.Parent */ delete from Parent where id=? [23503-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:373) at org.h2.constraint.ConstraintReferential.checkRowRefTable(ConstraintReferential.java:390) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:265) at org.h2.table.Table.fireConstraints(Table.java:1057) at org.h2.table.Table.fireAfterRow(Table.java:1075) at org.h2.command.dml.Delete.update(Delete.java:153) at org.h2.command.CommandContainer.update(CommandContainer.java:198) at org.h2.command.Command.executeUpdate(Command.java:251) at org.h2.server.TcpServerThread.process(TcpServerThread.java:406) at org.h2.server.TcpServerThread.run(TcpServerThread.java:183) at java.lang.Thread.run(Unknown Source) at org.h2.message.DbException.getJdbcSQLException(DbException.java:457) at org.h2.engine.SessionRemote.done(SessionRemote.java:607) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:200) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:154) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 21 more 5월 15, 2021 8:20:45 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test] Process finished with exit code 0
-
미해결캐글 실습으로 배우는 데이터 사이언스
RMSLE
안녕하세요. 이전 동영상에서는 RMSLE를 구할 때 exp()를 사용안하셨는데, 이번 동영상에서는 'np.exp(predicted_values)'이렇게 RMSLE코드 안에 exp를 사용하셨더라구요. 이건 그냥 RMSLE를 구하는 방법의 차이라고 이해하면 될까요?
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
오류가 있습니다
현재 porduct가 console에 지속적으로 업데이트가 되어서 알림창 갯수가 100단위를 넘어가고 있습니다. 본래 useState로 한번만 받아와야 하지 않나요? 두번째 오류는 ToucahbleOpacity인데 단순히 터치가 안되고 있습니다. import가 gesture-handler로 되어 있어서 그런가 해서 react-native로 옮겨서 시도해봤는데도 터치가 안되는것 같습니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
axios 쿼리에 대해서 질문있습니당
axios.get(`/api/product/products_by_id?id=${productId} &type=single`) 위의 코드 대신에, 이렇게 작성해도 될까요? 예를들면.. axios.get(`/api/product/${productId}`); 이런식으로 프론트에서 코드 작성후 서버에서 처리해줄때는, router.get('/:id', async (req, res) => { try { const post = await Post.findById(req.params.id)......} 이런식으로 작성 해주어도 될까요? 강사님이 코드 저런식으로 작성해준 이유는 성능면에서 더 뛰어나기 때문일까요? 궁금한게 너무 많아 여기저기 글쓴거같은데 죄송합니다 ㅠㅠ
-
미해결Slack 클론 코딩[실시간 채팅 with React]
질문
settings폴더에 웹팩 데브서버까지 세팅되어 있다고 하셔서 여기부터 세팅 시작하고있는데 prettier, eslint나 몇가지는 settings 폴더에 설정이 안되어있는건가요??
-
미해결AWS(Amazon Web Service) 중/상급자를 위한 강의
첨부파일 문의(Code Deploy 실습 1부 - From AWS 입문자 강의편)
첨부파일을 참고하라고 하는데 첨부파일이 누락된것 같습니다. 입문자 강의 '[11-5] Code Deploy 실습 - 1부' 에 있는 첨부파일과 동일한듯 합니다. sudo yum update sudo yum install ruby sudo yum install wget wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install chmod +x install sudo ./install auto sudo service codedeploy-agent status
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
프론트는 리액트를 사용할수 있나요?
프론트는 리액트로 구성해서 데이터 시각화 그래프를 그리려고 하는데 백엔드쪽 강의로 파이썬을 쓴다고 하면 이 강의를 듣는게 맞을까요?
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
알려주신대로 했지만 해결이 안됩니다.ㅠㅠ
알려주신대로 했지만 해결이 안됩니다.ㅠㅠ 혹시 다른 방법 없을까요? 원격으로 도움 받을 수는 없을까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
async/await 을 사용하면 exec()를 사용안해도 될까요?
틀린 지식일수도 있지만, exec()가 promise라고 알고있습니다. 몽고4부터exec()를 작성안해도되지만 작성해주는걸 추천한다고 합니다. 그럼 async/await를 사용하면 exec()를 작성안해줘도 되는걸까요? 강사님은 exec()방식을 선호하시나요, async/await 방식을 선호하시나요?
-
미해결캐글 실습으로 배우는 데이터 사이언스
Feature Selection관련
안녕하세요. 요즘 강의 정말 잘 듣고 있습니다. Feature Selection할 때, '피처를 하나씩 추가하고 변경해 가면서 성능이 좋지 않은 피처는 제거하도록 한다.'라고 하셨는데, 그래서 그런지 밑에 선생님이 적으신거 보니 feature_names = ["season", "weather", "temp", "atemp", "humidity", "windspeed", "year", "hour", "dayofweek", "holiday", "workingday"] 기존 feature 중에서 "month"를 빼셨더라구요. 그래서 "month"는 빼는게 성능이 더 좋아지나보다 했는데, 제가 "month" 한번 넣어봤더니 더 좋아지더라구요. 그래서 결론은 깜빡하시고 뺀건지, 아니면 그냥 제 경우에서만 이렇게 나온건지 궁금합니다. 그리고 추가적으로 피처를 변경해 가면서 성능을 확인하면 계속 30초씩 걸리는데, 원래 이런식으로 계속 돌려가면서 확인을 해야되는건가요? 그냥 몰라서 여쭤봅니다. 랜덤포레스트는 자체적으로 피처를 줄이니까 그냥 다 넣으면 안될까 해서요. 감사합니다.
-
미해결[딥러닝 전문가 과정 DL1101] 딥러닝을 위한 파이썬 레벨1
variance of scores 와 score_std 의 의미가 알고 싶습니다 .
variance of scores 와 score_std 의 의미가 알고 싶습니다 . >>> score1 = 10 >>> score2 = 20 >>> score3 = 30 >>> n_student = 3 >>> >>> >>> print("제곱의 평균을 구해라!") 제곱의 평균을 구해라! >>> mean_of_squre = (score1**2 + score2**2 + score3**2) / n_student >>> print("제곱의 평균값 확인 : ", mean_of_square) 제곱의 평균값 확인 : 466.6666666666667 >>> >>> print("스코어 평균을 구해라!") 스코어 평균을 구해라! >>> >>> mean_of_score = (score1 + score2 + score3) / n_student >>> print("평균값 : ", mean_of_score) 평균값 : 20.0 >>> print("평균의 제곱을 구해라" ) 평균의 제곱을 구해라 >>> square_of_mean = mean_of_score ** 2 >>> print (square_of_mean) 400.0 >>> >>> score_variance = mean_of_square - square_of_mean >>> score_std = score_variance ** 0.5 >>> print("variance ", variance) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'variance' is not defined >>> print("variance ", score_variance) variance 66.66666666666669 >>> print(score_std : " , score_std) File "<stdin>", line 1 print(score_std : " , score_std) ^ SyntaxError: invalid syntax >>> print("score_std : " , score_std) score_std : 8.16496580927726
-
미해결자바스크립트 비기너: 튼튼한 기본 만들기
eval 내용에 관해서 질문드리겠습니다
그러면 자신의 웹사이트가 악의적인 코드로 인해 해킹당하지 않으려면 방어는 주로 어떤식으로 하나요? 업체에 맡기나요??
-
미해결선형대수학개론
Theorem 2 관련 질문
안녕하세요 항상 좋은 강의 정말 감사드립니다! 다른 분들의 질문에 답해주신 것과 수업 자료의 자막이 상충되는 것이 있는 것에 대한 질문과, 증명과정에 있어서 이해가 가지 않는 것에 대한 질문이 있습니다. ① 우선 {v1, ... ,vr}이 linearly dependent한 set이라고 가정한 뒤, Chapter 1의 Theorem 7에 의해 벡터 set에서의 인덱스 p를 잡고 c1v1 + ... + cp-1vp-1 = vp가 성립함을 보이며 "v1부터 vp-1까지 linearly independent한 벡터들로 골라준 것" 이라고 설명해주셨고, 게시판에 올라온 다른 질문들의 답변에도 동일한 설명을 해주셨는데 자막으로는 "dependent입니다. 말실수입니다."라고 하셔서 뭐가 맞는 건지 헷갈립니다. (동일한 상황의 자막이 22:06에도 등장합니다) 자막은 무시하고 그냥 원래 설명대로 {v1, .. ,vp-1}은 linearly independent한 set으로 이해하면 되는 건가요?? ② 두번째 질문은, 마지막 증명과정에서 c1(λ1-λp)v1 + ... + cp-1(λp-1-λp)vp-1 = 0 가 "trivial solution만을 가지기 때문에 {v1 ... vr} 이 linearly dependent하다는 가정이 위배되므로 {v1 ... vr} 이 linearly independent하다" 라고 설명해주셨는데, vp-1는 벡터 set {v1, ..., vr} 에서 인덱스로 잡은 값인데, 벡터셋의 일부 벡터들이 linearly independent하다고 전체 벡터셋이 linearly dependent하지 않다고 할 수는 없지 않나요?? 즉, {v1, ... vp-1, vp, ... vr}이 linearly dependent하다고 한 것이 첫번째 가정인데, {v1, ..,vp-1}이 linearly independent하다고 해서 {v1, ... ,vr}이 linearly dependent하다는 가정이 틀렸다고 할 수는 없지 않나요?? 그리고 첫번째 질문에 보시면 애초에 {v1, ... vp-1}을 linearly independent한 벡터들로 잡은 것 아닌가요?? 매번 질문에 친절하게 답변해주셔서 정말 감사드립니다!
-
미해결머신러닝 엔지니어 실무
강의 슬라이드 공유 부탁드립니다!^^
안녕하세요 선생님! 강의 수강평 남겼습니다. 강의 슬라이드 공유 부탁드리겠습니다^^ 메일 주소는 8kwchoi8@naver.com 입니다. 좋은 강의 감사합니다^^!
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
선생님 props로 가져오는 방식 질문있습니다.
부모컴포넌트에서 받은 props를 받아올때 const child => (props) => { {props.something} } 이렇게 받아오는 방식과, const child => ({something} )=> { {something} } 사용하는 방식이있습니다. 그냥 사람마다 편한 방식을 사용하는것인가요? 선생님은 props 이렇게 사용하시는데 실무에서도 저렇게 사용하시는지 또 어떤방식을 더 선호하시는지 궁금합니다 개인적으로 저는 후자의 방식을 사용하고있는데 받아오는것이 많은 자식컴포넌트같은 경우 지저분해질것 같다란 생각이 드네용
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
서버쪽에서 json으로 프론트에 반환해주는 정확한 이유는 뭔가요?
안녕하세요! 서버쪽에서 json으로 프론트에 리턴해주는 이유가 궁금해요! return res.status(200).send({ success: true, productInfo });이렇게 send로 보내줘도 프론트단에서 콘솔 찍으면 잘 받아와 지는것 같은데요 json은 키 와 값으로 되어있는 문자열이고, 문자열로 이루어진 데이터만 네트워크(?)를 통해 전달될 수 있어서 그런걸까요? 가르침 부탁드립니당!
-
미해결초보자도 할 수 있는 웹 취약점 진단(주요정보통신기반시설)
https://burp
안녕하세요 강사님 https://burp 경로 접속 시도하였으나, 아래와 같이 연결이 되지 않고 있습니다. 사이트에 연결할 수 없음 이 경우 어떻게 해야 좋을까요
-
미해결플러터와 장고로 1시간만에 퀴즈 앱/서버 만들기 [무작정 풀스택]
http.get 타입 문제
final response = await http.get('https://drf-quiz-test.herokuapp.com/quiz/3/'); The argument type 'String' can't be assigned to the parameter type 'Uri'. 해당 오류를 도저히 해결할 수 가 없는데, 혹시 아시는 분 있나요..
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
CascadeType.ALL로 부모나 자식을 remove할 때 질문입니다
안녕하세요! 강의 14:33 내용의 코드를 치며 공부하던 중 orphanremoval=false일 때 자식을 삭제하기 위해선 어떻게 해야할 지 궁금해져서 아래와 같이 코드를 짜보았습니다. Parent 엔티티 코드는 orphanRemoval=true를 삭제하고 나머지는 모두 강의와 같게 하였습니다. 메인코드는 아래와 같이 작성하였습니다. Parent parent=new Parent(); parent.setName("kth990303"); Child child1=new Child(); child1.setName("kthbaby1"); Child child2=new Child(); child2.setName("kthbaby2"); parent.addChild(child1); parent.addChild(child2); em.persist(parent); // 쿼리 확인을 위한 db에 정보 넘겨주기 em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); // 첫번째 자식 삭제 findParent.getChildren().remove(0); tx.commit(); 당연히 orphanRemoval=true가 아니므로 예상대로 삭제가 되지 않은 상태임을 확인했습니다. 문제는 tx.commit() 바로 위에 em.remove(child1); 이나, em.remove(child2); 나 em.remove(parent); 를 해주면 하나만 삭제되는 것이 아닌, 모두 삭제돼버린다는 점이었습니다. CascadeType.ALL나 CascadeType.PERSIST로 설정해주어서 parent가 삭제되면 children이 모두 삭제되는 것은 예상했지만, child 한명이 삭제될 때, 모든 children과 parent가 삭제될줄은 예상하지 못했습니다. child하나를 삭제할 때, parent까지 삭제된다는 이 부분이 바로 cascade가 연관관계 주인과 상관없이 같이 영속된다고 설명해주신 부분이 맞을까요? 코드 전체에 Parent와 Child 엔티티만 있다고 가정할 때, parent가 child의 단일소유자이므로 cascadetype.ALL나 cascadetype.PERSIST로 설정해준다고 하면, orphanRemoval=true를 하지 않는 한, child 한명만 따로 삭제는 불가능한건가요? 감사합니다 :)