묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
게시글 삭제시 에러 문의드립니다
안녕하세요 선생님, 잦은 질문 죄송합니다ㅠㅠ 현재 안드로이드 코틀린 커뮤니티앱 강의 중 게시글 삭제 만들기까지 진행한 상황입니다. 게시글 삭제를 클릭해도 화면과 파이어베이스에 해당 글이 그대로 남아있는 문제가 발생해 질문드립니다(앱이 죽지는 않고, 로그에 에러 메시지도 찍히지 않습니다). https://github.com/shinyelee/my-solo-life 혹시몰라 리얼타임DB, 스토리지 규칙도 캡처했습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
CASCADE.ALL 설정 후 REMOVE시 동작문의
안녕하세요. cascade에 설정과 관련되서 질문드립니다. 부모 엔티티와 자식 엔티티의 관계는 아래코드 처럼 관계를 설정했습니다. >>부모엔티티 @OneToOne(mappedBy = "item", cascade = CascadeType.ALL) private Movie movieItem; >>자식엔티티 @OneToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "id") private Item item; 영속성 전이를 ALL로 설정했으니 부모엔티티를 remove할때 자식엔티티도 같이 remove 되야된다고 생각했는데 실제로 동작시켜보면 remove가 되지 않고 exception이 발생을 합니다. (.m.m.a.ExceptionHandlerExceptionResolver[0;39m [2m:[0;39m Resolved [org.springframework.dao.InvalidDataAccessApiUsageException: No sources given; nested exception is java.lang.IllegalArgumentException: No sources given]) 그래서 명시적으로 자식.remove -> 부모.remove를 연달아 호출을 시켜줬는데 exception 발생내용은 동일하게 발생하더라구요 영속성전이만으로는 remove가 되지 않는 것인지 궁금하고, 명시적으로 remove를 시켰음에도 불구하고 왜 삭제가 되지 않는 것인지 질문드립니다~!
-
해결됨프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
리스트.remove(n)으로 함수 호출시, n값이 복수일 때.
a = [1, 2, 3, 7, 8, 7] a.remove(7) print(a) 일 때, 출력은 [1,2,3,8,7]로 나옵니다. 지정한 값(여기선 7이죠)이 복수 개일 때, 우선순위로 제거되는 원소는 index number가 제일 낮은 원소인가요?
-
해결됨자바 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
-
해결됨자바 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 한명만 따로 삭제는 불가능한건가요? 감사합니다 :)
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
피드백 받고싶어서 올려봅니다.
from random import * lst = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] # shuffle(lst) chicken = randint(1,20) lst.remove(chicken) print("-- 당첨자 발표 --") print("치킨 당첨자 :", chicken) print("커피 당첨자 :", sample(lst, 3)) print("-- 축하합니다 --") 이렇게 작성해봤습니다. 분명히 1부터 20까지 숫자 자동생성 가능할텐데 range함수를 까먹고 몰랐어서 수작업으로 쳐서 넣었네요ㅋㅋ 강의 너무 유익하고 잘보고 있습니다. 감사합니다.