월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
cascade=ALL, orphanRemoval=true 관련 질문
안녕하세요.혼자 고민하고 생각 해보다 해결이 되지 않아 문의드리러 왔습니다 ㅠㅠ해당 수업을 듣고, 사이드 프로젝트를 수행하면서 orphanRemoval을 사용해보게 되었습니다.대략적인 엔티티간의 관계는 다음과 같습니다.총 4개의 엔티티가 각각 다대일 매핑으로 이루어져 있는데요.각 엔티티의 정보는 다음과 같습니다.엔티티 A : 유저엔티티 B : 글엔티티 C : 글에 포함되는 정보엔티티 D : 엔티티 C에 포함되는 정보문제는 엔티티 B까지만 cascade=ALL, orphanRemoval=true가 적용된다는 것입니다..ㅠㅠ차이가 있다면, 엔티티 A는 유저의 정보라서, 항상 저장이 되어있는 것을 꺼내어와서 사용한다는 것이고(저장을 회원가입 로직에서만 수행합니다.), 엔티티 B, C, D는 글 작성 시 모두 새로 생성하여 사용한다는 점입니다.저는 엔티티B 삭제 로직에서, 엔티티A의 List에서 엔티티B를 remove 하면 B, C, D가 모두 삭제되는 것을 기대했는데, 전혀 삭제가 되지 않습니다 ㅠ (List에서 엔티티B가 제거는 됩니다..)오히려 엔티티A의 List에서 엔티티B을 remove하고, 추가적으로 엔티티B의 리포지토리에서 엔티티 B를 삭제해야만 비로소 삭제가 완료됩니다.기능 자체를 구현은 했지만, 이렇게 동작하는 원인을 알고싶어서, 여기저기 찾아보다가 답을 찾지 못해 이곳에 질문 글을 남기게 되었습니다 ㅠㅜ관련 코드는 아래 깃허브 리포지토리에 있습니다.엔티티 리포지토리https://github.com/SeolYoungKim/siders/tree/oauth2login/src/main/java/com/example/siderswebapp/domain삭제 로직 리포지토리https://github.com/SeolYoungKim/siders/tree/oauth2login/src/main/java/com/example/siderswebapp/service/post
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
new Integer가 좋지 않은 이유
안녕하세요 궁금한게 있어 글 남깁니다강의 7:30쯤에서 Integer.valueOf 해도 되지만 new Integer를 사용하겠다, 요즘은 new Integer가 별로 안 좋다고 한다~ 라고 말씀하셨는데요new Integer가 좋지 않은 이유가 궁금합니다 나름 열심히 구글링 해보았는데 정확한 이유를 찾지 못해 여쭤봅니다 ㅠㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
왜 Team 엔티티 조회 쿼리가 발생되는지 잘 모르겠습니다.
안녕하세요, 강의 잘 듣고 있습니다.(아래 내용은 @ManyToOne의 default 설정 값인 fetch가 EAGER일 때 입니다...)해당 영상 5분 7초 때의 콘솔을 보면,Team 조회 쿼리가 추가로 한 번 더 발생되고 있습니다.하지만 jpql쿼리를 보면,"select m from Member m inner join m.team t"즉 Member 엔티티와 연관된 Team 엔티티를 inner join 하여 같이 한 번에 가져오는 쿼리입니다."select m from Member m" 이라고 jpql을 작성했으면 당연히 연관된 Team 엔티티를 조회하는 select 쿼리가 별도로 실행되는 게 맞지만, inner join으로 작성했기 때문에 별도의 Team 엔티티를 조회하기 위한 select 쿼리가 발생할 필요가 없는 것 같은데, 추가로 select 쿼리가 발생하는 부분이 잘 이해가 되지 않습니다.답변 미리 감사드립니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
벌크연산 영속성 컨텍스트 관련
벌크연산(update) 후 em.clear() 로 영속성 컨텍스트 초기화다시 객체 조회를 해서 프린트문을 입력했는데 결과가 변하지 않습니다JPQLem.flush(); em.clear(); String query = "update Member m set m.age = 30"; em.createQuery(query).executeUpdate(); em.clear(); Member m3 = em.find(Member.class, member3.getId()); System.out.println("member3.getAge() = " + member3.getAge()); tx.commit(); 콘솔Hibernate: select member0_.id as id1_0_0_, member0_.age as age2_0_0_, member0_.TEAM_ID as team_id4_0_0_, member0_.username as username3_0_0_ from Member member0_ where member0_.id=? member3.getAge() = 0 9월 30, 2022 11:55:54 오전 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/jpql] Process finished with exit code 0
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
fetch 조인과 eager(즉시로딩) 관련
fetch 조인은 결국 즉시로딩 처럼 동작한다그런데, fetch = EAGER 즉시로딩으로 설정하지 않는 이유는 아예 로딩 설정을 저렇게 해버리면 fetch 조인이 필요하지 않을 경우에도 모든 쿼리가 한 번에 날아가서 리소스 낭비임제가 생각하는것이 맞을까요? 즉시로딩은 연관관계로 맺어진 엔티티를 실제 사용할 때만 DB로 쿼리를 날리는것이 아니라 처음부터 모두 연관 엔티티를 가져와서 쿼리를 날리는것으로 이해를 했는데요fetch 조인 역시 같은 동작을 하는것같아서 단순하게 즉시 로딩을 설정해버리면 안되나? 라는 의문이 들었습니다.아니면 제가 즉시로딩과 fetch 의 동작 기전을 아직 잘못 이해하고 있는것일까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
세타조인
세타 조인과 크로스 조인이 같은 건가요? 블로그에 잘못된 정보가 많아서 여기에 여쭤봅니다...
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
casecade
casecade는 연관된 엔티티의 영속화를 같이 해주는 편리함을 제공한다고 배웠습니다.근데 제 생각에는 @OneToMany나 @OneToOne 엔티티에서 추가를 하면 무조건 연관된 엔티티는 영속화가 되는게 좋다고 생각해서 @OneToMany나 @OneToOne에는 거의 cascade = CascadeType.ALL를 붙여줘도 된다 이렇게 생각해도 되나요?? 제생각에는 항상 붙여주어도 괜찮을 거 같은데 혹시 주의 사항이나 붙이면 안되는 경우가 있을까요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
2분24초
FAVORITE_FOOD랑 ADDRESS에서 MEMBER_ID가 FK인건 알겠는데 어떻게 PK가 되는거죠? @JoinColumn으로 외래키랑 매핑하는건 알겠는데 MEMBER_ID가 PK 되는 과정이 궁금합니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
파라미터 바인딩
강의에서는 파라미터 바인딩을 이름 기반으로 해라 정도만 나와있습니다.그런데 , 이 파라미터 바인딩이 무엇이고, 이걸 왜 쓰는지 이런 설명이 없다보니 이해가 되지 않습니다. 파라미터 조인으로 뭘 하는 건가요?ㅠㅠList<Member> resultList = em.createQuery("select m from Member m inner join m.team t " + "where t.name = :teamname", Member.class) .getResultList();
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
성능과 즉시로딩/지연로딩 관련해서 질문드립니다.
질문드릴 것이 두 가지가 있습니다. 한 번에 조회를 적게 하되 쿼리를 여러 번 날리는 것과 join을 해서 한 번에 조회를 많이 하되 쿼리를 적게 날리는 것 중 어느 것이 성능적으로 좋은지 궁금합니다.N+1 문제와 관련하여 이 문제는 꼭 JPQL을 사용할 때만 발생하는 것인지 아니면 em.find 를 사용하여 조회할 때도 발생하는 것인지 궁금합니다.감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
maven 파일
강사님 처럼 maven 파일을 생성할라고 하니 저는 윈도우 운영체제여서 그런지 몰라도 maven 원형 이라는 셀렉만 있어서 maven 원형으로 파일을 만들면 main ,test 같은 src가 안만들어집니다....
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
오류입니다 ㅠㅠ
에 있는 파일에서 알려주신 것 처럼 MVCC=TRUE를 넣었음에도 발생하는 오류입니다h2는 1.4.199 버전입니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
부모엔터티만 삭제
안녕하세요 부모 엔터티만 삭제에 대해서 물어 볼게 있습니다부모 객체를 삭제할 때 orphanRemoval=true 등을 이용하여 고아가 된 자식 객체도 같이 제거하는데제가 자식부분 데이터는 필요해서 부모만 삭제하고 싶은데 삭제하면 Cannot delete or update a parent row: a foreign key constraint fails (`magoklivinglab`.`bs_noise`, CONSTRAINT bs_noise_FK FOREIGN KEY (`sensor_code`) REFERENCES bs_sensor (`code`))뜹니다외래키가 얽혀 있으니 삭제가 어려운거 같은데 엔터티에서 객체를 참조 안하고 String 이나 Long으로 바꿔서 참조 아이디를 쓰면 되긴하지만 그렇게 바꾸면 나머지 service나 repository도 다 바꿔야되서 어렵습니다부모만 삭제 어떻게 하는지 알려주시면 감사하겠습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JpaMain 실행시 오류가 발생합니다
게시판을 검색해보니 H2를 찾지 못해서 나오는 오류라고 하는데 xml에 소스 추가했고 jpasho.mv.db도 만들어져 있습니다파일은 블로그에 올려두었습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
MEMBER_SEQ를 2번 호출 하는 이유
처음 호출 하면 51개로 맞추고 그 다음부터, 메모리에서 사용한다고 하는데 이렇게 하는 이유가 무엇인가요 ? 처음 호출 할때 50개를 미리 세팅 하고 1번부터 사용하면 안되나요???
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시 객체의 초기화
프록시객체가 만들어지면 1차캐시에 들어가고 그 상태에서 초기화를 하면 실제 entity가 만들어져서 프록시 맴버변수로 들어가는것으로 이해했는데 맞나요??
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
OrphanRemoval = true 관련 질문드립니다
강의에서 orphanRemoval = true 로 설정 했을때, findParent.getChildList().remove(0);를 하면 child 객체가 db에서 사라진다 라는 부분이 조금 햇갈립니다(14:27 부분)고아객체 설정시 부모 클래스를 지우면 child 객체가 같이 삭제가 된다는 말은 이해가 됩니다. 그런데 orphanRemoval 를 false로 해도 findParent.getChildList().remove(0); 이 부분은 쿼리가 나가고 지워지는게 아닌걸까요?다시 말해 orphanRemoval 과 상관없이 당연히 child 객체를 호출해서 .remove() 라고 하면 삭제가 되는게 아닌가요?이 부분이 헷갈립니다 ㅠㅠ try{ Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); findParent.getChildList().remove(0); tx.commit(); } catch (Exception e) {
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
초기화의 정확한 의미
강의를 수강하다가 초기화의 정확한 의미가 잘 와닫지 않아서 질문드려봅니다.제가 이해하기로는 특정 값에 값을 set 할때 초기화한다라고 이해했는데 강의에서 .getName 도 초기화라고 표현이 되어 있더라고요이 초기화의 정확한 뜻이 무엇일까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
h2 오류
h2 파일에서 bin 파일 h2.bat 접속하여 강의 대로 연결 했는데 이런 오류가 뜨네요 구글링해도 해결방법이 안나와요..Unsupported database file version or invalid file header in file "C:/Users/tlswo/test.mv.db" [90048-214] 90048/90048 (도움말)org.h2.jdbc.JdbcSQLNonTransientConnectionException: Unsupported database file version or invalid file header in file "C:/Users/tlswo/test.mv.db" [90048-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:678) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:212) at org.h2.mvstore.db.Store.convertMVStoreException(Store.java:161) at org.h2.mvstore.db.Store.<init>(Store.java:145) at org.h2.engine.Database.<init>(Database.java:324) at org.h2.engine.Engine.openSession(Engine.java:92) at org.h2.engine.Engine.openSession(Engine.java:222) at org.h2.engine.Engine.createSession(Engine.java:201) at org.h2.server.TcpServerThread.run(TcpServerThread.java:175) at java.base/java.lang.Thread.run(Thread.java:834)Caused by: org.h2.mvstore.MVStoreException: The write format 1 is smaller than the supported format 2 [2.1.214/5] at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:1004) at org.h2.mvstore.MVStore.getUnsupportedWriteFormatException(MVStore.java:1066) at org.h2.mvstore.MVStore.readStoreHeader(MVStore.java:886) at org.h2.mvstore.MVStore.<init>(MVStore.java:463) at org.h2.mvstore.MVStore$Builder.open(MVStore.java:4082) at org.h2.mvstore.db.Store.<init>(Store.java:136) ... 6 more at org.h2.message.DbException.getJdbcSQLException(DbException.java:678) at org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at org.h2.engine.SessionRemote.done(SessionRemote.java:606) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:163) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:433) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:325) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:288) at org.h2.server.web.WebServer.getConnection(WebServer.java:808) at org.h2.server.web.WebApp.login(WebApp.java:1033) at org.h2.server.web.WebApp.process(WebApp.java:226) at org.h2.server.web.WebApp.processRequest(WebApp.java:176) at org.h2.server.web.WebThread.process(WebThread.java:152) at org.h2.server.web.WebThread.run(WebThread.java:101) at java.base/java.lang.Thread.run(Thread.java:834)
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Join 관련 테이블에 데이터 미반영 관련 질문드립니다
아래 코드와같이 Inheritance strategy 설정 및 @DiscriminatiorColum 에노테이션을 추가하였습니다(1) DB 결과를 보면 movie 테이블에 똑같은 데이터가 2번 저장됩니다("Create")임에도 불구하고(2) movie.setDirector 등 관련 설정 데이터가 들어가지 않습니다(3) DType 테이블이 생성되지 않습니다어떠한 이유 때문에 이문제가 발생하는지 잘 모르겠습니다@Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn public class Item { @Id @GeneratedValue private Long id; private String name; private int price; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } } package helloJpa; import javax.persistence.Entity; @Entity public class Movie extends Item{ private String director; private String actor; public String getDirector() { return director; } public void setDirector(String director) { this.director = director; } public String getActor() { return actor; } public void setActor(String actor) { this.actor = actor; } } 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{ Movie movie = new Movie(); movie.setDirector("Kim"); movie.setActor("Brandon Grace"); movie.setName("Saga of Wings"); movie.setPrice(10000); em.persist(movie); em.flush(); em.clear(); Movie findMovie = em.find(Movie.class, movie.getId()); System.out.println("findMovie =" + findMovie); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } } `DB`