월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
MappedBy는 읽기 전용으로 사용하는게 좋다고 하셨는데 CASCADE는 어떻게 등장한건가요?
[질문 템플릿]1. 예2. 예3. 예[질문 내용]CASCADE와 고아 객체 둘다 관계의 주인이 아닌 MappedBy 속성을 갖는 객체를 통해 주인 객체에 영향을 주는 것 같은데CASCADE가 수행하는 작업방식 보다주인 쪽에서 Insert를 수행하고 List쪽에 업데이트 된 주인 객체의 리스트를 읽어오는 게 더 자연스럽지 않나 의문이 들었습니다.고아 객체 또한 주인 쪽에 DELETE를 수행하고변화된 List를 읽어들이는게 저에겐 더 자연스럽게 느껴집니다.왜 CASCADE와 고아객체를 활용하면서 까지 주인 객체가 아닌 반대편에서 DB를 수정하는 작업을 수행하는지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
7분 4초 질문 있습니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]7분 4초에서 작성한 jpql 쿼리를 실행하면 강의에서는 cross join으로 쿼리가 작성되는 걸 확인할 수 있는데 저는 같은 코드를 작성해서 실행했을 때 아래처럼 내부조인으로 작성되는 걸 확인했습니다.Hibernate: /* select m from Member m, Team t where m.username = t.name */ select m1_0.id, m1_0.age, m1_0.TEAM_ID, m1_0.username from Member m1_0, Team t1_0 where m1_0.username=t1_0.name 왜 그런 걸까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 관계에서
Member와 Team의 관계인 조건에서팀을 바꾼 다는 가정하에 Member의 TeamId 값을 바꿔보려고 코드를 구현 해봤는데생각하는대로 되지 안더군요. 어떻게 해야 하나요?Member findMember = em.find(Member.class, 3L); findMember.getTeam().setId(2L); tx.commit();Member에서 TeamId의 원래의 값이 1에서 2로 변경 하고자 하는 코드 입니다.업데이트 쿼리가 찍히지 않습니다. 도와주시면 감사하겠습니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 주인과 cascade가 상충되는 상황에 대해서
제가 알고 있기론 연관관계 주인만 엔티티 수정이 가능하고 아니면 조회만 가능하다고 알고 있습니다.@OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();이 코드에서 team은 member을 조회만 할수 있습니다.Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); //역방향(주인이 아닌 방향)에서 멤버 추가 시도 team.getMembers().add(member); //실패! 그러나 cascade 또는 고아 객체 제거 옵션을 사용하면 부모 엔티티를 통해 자식 엔티티의 생명주기를 컨트롤 할 수 있다고 배웠습니다.@Entity public class Parent { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) List<Child> childList = new ArrayList<>(); }Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); child1.setParent(parent); //연관관계 추가 child2.setParent(parent); //연관관계 추가 parent.getChildList().add(child1); parent.getChildList().add(child2); //부모 저장, 연관된 자식들 저장 em.persist(parent); 두 개념이 서로 충돌하는것 같은데 어떻게 동작하는 것일까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA FULL TEXT SEARCH 에 관한 질문입니다.
영한님, 안녕하세요.본 강의와 맞지 않는 질문을 드린거 같아서 죄송합니다. 현재 댓글을 검색하는 기능에 기존 LIKE %keyword% 를 쓰는 방식보다 full text search를 적용하는 것이 성능 상 이점이 있다고 하여 적용 중에 있습니다. 하지만, 기존 like 방식보다 오히려 성능이 안나오는 현상을 겪고 있습니다. 10만 건을 테스트를 해보았고 100만건 1만건 5만건 모두 성능이 비등하거나 떨어집니다.. ex) 10만건 성능like = 429msfull text search = 476ms 의 성능을 보이고 있습니다. 뭔가 놓치고 있는 것 같습니다. 그런데 mysql 실행계획으로 퍼포먼스를 확인해보니, full text search가 2배 빠른 것으로 확인이 되는데 이게 왜 그런 건지 모르겠습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.detach 메서드와 관련하여 질문드립니다.
위의 로직을 보시면Member 객체를 생성후 persist() 메서드를 호출한 후에 detach() 메서드를 호출하였습니다.그러면 제 생각에는 persist()를 호출한 순간에 쓰기지연 SQL저장소에 insert문이 있기 때문에 flush하면 insert 쿼리가 console에 나와야하는데 왜 안나오는지 이유를 모르겠습니다.혹시 detach를하면 쓰기 지연 SQL저장소에 있는 insert가 사라지는건가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 변경 후 일대다
@JoinColumn(name = "MEMBER_ID) List<AddressEntity> addressHistory = ..다대일이 아닌 일대다로 매핑한 이유가 있을까요?앞에서 다쪽에 @JoinColumn하는 것을 추천하셨는데 일쪽에 연관관계 주인을 잡은 이유가 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값 컬렉션 HashSet 타입인 favoriteFoods를 수정할 때 궁금한 것이 있습니다.
<Member 클래스>@ElementCollection @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID") ) @Column(name = "FOOD_NAME") // 값이 하나라 가능 private Set<String> favoriteFoods = new HashSet<>();<JpaMain 함수>try { Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("homeCity", "street", "10000")); member.getFavoriteFoods().add("치킨"); member.getFavoriteFoods().add("족발"); member.getFavoriteFoods().add("피자"); member.getAddressHistory().add(new Address("old1", "street", "10000")); member.getAddressHistory().add(new Address("old2", "street", "10000")); em.persist(member); em.flush(); em.clear(); System.out.println("=========== START ==========="); //todo: 값 타입 수정 Member findMember = em.find(Member.class, member.getId()); Address a = findMember.getHomeAddress(); findMember.setHomeAddress(new Address("newCity", a.getStreet(), a.getZipcode())); // HashSet이라서 set 메서드 활용 불가 findMember.getFavoriteFoods().remove("치킨"); findMember.getFavoriteFoods().add("한식"); tx.commit();위의 메인함수를 여러 번 실행했는데 HashSet임에도 불구하고 순서가 지켜진 체로 DB에 저장된 결과가 다음과 같습니다.그러나, em.flush()와 em.clear()를 주석처리하고 다시 실행해보면 DB로 조회할 때 순서가 지켜지지 않고 무작위로 저장이 됩니다. 제 예상은 em.flush()가 add()로 저장된 컬렉션 값을 먼저 DB에 반영하니까 순서가 보장되서 항상 같은 결과가 나오지 않나 생각됩니다. 이것이 맞나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
생각한대로 실행이 되지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.제 프로젝트 압축파일입니다.https://drive.google.com/file/d/1CsFmsNczcupxGIQTMM_-uA7EQFzu3KRq/view?usp=sharing JpaMain에서Movie movie = new Movie(); movie.setDirector("aaa"); movie.setActor("asdf"); movie.setName("바람과 함께 사라지다"); movie.setPrice(10000); em.persist(movie); em.flush(); em.clear();에 의해 movie가 insert되어야하는데 실제로 데이터베이스의 MOVIE테이블을 조회해보면 아무것도 없습니다. 그리고 아래와 같은 에러로그가 뜨는데 어떻게 해야할지 모르겠어서 질문드립니다!https://drive.google.com/file/d/1YCpr2ZBFSC84lw3wvn5wks22DVx1GHAM/view?usp=sharing
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
insert문이 안날라갑니다!!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 위에는 로그부분이고아래는 JpaMain 코드입니다!엔티티는 만들어지나 insert문이 안날라갑니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
team과 findmember.getTeam()
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 제가 실습해보다가 궁금한 부분이 생겨서 질문드립니다. public class JpaMain { public static void main(String[] args){ EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // persistence.xml에 있는 <persistence-unit name="hello">애서 name이 hello니깐 createEntityManagerFactory("hello")에 hello 넣어줘야함 EntityManager em = emf.createEntityManager(); // 밑의 close() 이전에 할 거 다하고 close()로 entitymanager랑 entityManagerFactory 닫음 EntityTransaction tx = em.getTransaction(); try{ tx.begin(); Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new Member(); member.setUsername("member1"); member.setTeam(team); em.persist(member); Member member2 = new Member(); member2.setUsername("member2"); em.persist(member2); // em.flush(); em.clear(); Member findmemeber = em.find(Member.class,member.getId()); List<Member> findmembers = findmemeber.getTeam().getMembers(); System.out.println(team); System.out.println(findmemeber.getTeam()); tx.commit(); } // transection을 열고 코드를 수행하고 transaction을 닫음 catch (Exception e){ System.out.println(e); tx.rollback(); } // 에러나면 transaction 롤백 finally{ em.close(); } // tx.begin() ~ tx.commmit()은 transaction단위, JPA는 데이터베이스에 대한 작업시 트랜잭션 작업단위로 해야한다. emf.close(); } } 이렇게 코드를 쳐봤는데System.out.println(team)과System.out.println(findmember.getTeam())이 jpabook.jpashop.domain.Team@2b34e38cjpabook.jpashop.domain.Team@5633ed82으로 다른 인스턴스가 출력이 되는 걸 확인했습니다.제 생각에는 member.setTeam(team)을 했기 때문에 같은 인스턴스가 나올 것이라고 생각했는데 왜 다른 인스턴스가 나오게 되는 것인지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 실전예제1 따라하다 오류가 생겨 문의 드립니다 Dec 28, 2023 11:18:34 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformationINFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...]Dec 28, 2023 11:18:34 PM org.hibernate.Version logVersionINFO: HHH000412: Hibernate Core {5.3.10.Final}Dec 28, 2023 11:18:34 PM org.hibernate.cfg.Environment <clinit>INFO: HHH000206: hibernate.properties not foundDec 28, 2023 11:18:34 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>INFO: HCANN000001: Hibernate Commons Annotations {5.0.4.Final}Dec 28, 2023 11:18:34 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureWARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)Dec 28, 2023 11:18:34 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp://localhost/~/jpashop]Dec 28, 2023 11:18:34 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001001: Connection properties: {user=sa}Dec 28, 2023 11:18:34 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001003: Autocommit mode: falseDec 28, 2023 11:18:34 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>INFO: HHH000115: Hibernate connection pool size: 20 (min=1)Dec 28, 2023 11:18:34 PM org.hibernate.dialect.Dialect <init>INFO: HHH000400: Using dialect: org.hibernate.dialect.H2DialectDec 28, 2023 11:18:35 PM org.hibernate.resource.beans.spi.ManagedBeanRegistryInitiator resoveBeanContainerINFO: HHH10005002: No explicit CDI BeanManager reference was passed to Hibernate, but CDI is available on the Hibernate ClassLoader.Dec 28, 2023 11:18:35 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/jpashop] 커뮤니티에 있는 오류들 참고해서 봤는데 잘 모르겠습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
insert문
jpa에서 코드도 제대로 치고 <property name="hibernate.hbm2ddl.auto" value="create" />create로 설정하고 했는데 왜 저장할때 insert문이 안날라 가는걸까요?테이블은 제대로 생성이되는데 데이터가 저장이 안되고 insert문도 날라가지 않습니다!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입 쓰는 이유, 값타입의 한계와 해결방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]값 타입을 공부하며 정리한 생각입니다.제가 올바르게 생각했는지 검토해주시면 감사드리겠습니다개인적으로 정리한 글이라 존댓말이 아닌 점 양해주시면 감사드리겠습니다 값타입은 왜 쓰는가?엔티티는 서로 공유하는 것이 목표이다그래서 엔티티 필드를 다른 엔티티 필드와 연관관계 매핑(@ManyToOne 등)을 하는 것이다하지만 모든 엔티티 필드를 서로 공유한다고 하면 너무 복잡하지 않겠는가?필드가 해당 엔티티에만 소속되어 다른 엔티티와는 연관(공유)되지 않는 값이 있으면 조금이라도 단순해질 수 있지 않을까?그래서 값 타입을 사용하는 것이다!값 타입의 한계는 무엇인가?Wrapper type(기본 값 타입), String type(기본 값 타입), 임베디드 타입은 객체 타입이다.그래서 기본값 타입과 임베디드 타입은 참조 공유가 가능하다.객체 타입의 참조 공유가 문제라고 생각하면 문제일 순 있겠지만자바에서 참조 공유를 막을 수 있는 방법은 없다. 그래서 참조 공유의 문제(두 객체가 하나의 참조를 바라볼 수 있는 문제)는 차치하자.그러면 발생할 수 있는 문제는 무엇이냐면하나의 참조를 바라보는 두 객체가 존재할 때, 해당 참조의 실제 값이 바뀌면 두 객체의 값이 모두 변경될 수 있다는 것이다.(참고로, 만약 참조의 실제 값이 바뀔 때 두 객체의 값이 모두 변경되길 의도했다면 값타입이 아니라 엔티티 타입을 써야 한다. 왜냐하면 공유가 목표였다면 값타입이 아니라 엔티티를 사용하는 것이 옳기 때문이다.)물론 Wrapper type(기본값 타입), String type(기본값 타입) 은 setter 가 없기 때문에 값 변경이 불가능하다.그래서 기본값 타입은 참조 공유의 문제로부터 어느정도 자유로울 수 있다.그럼 진짜 문제는 임베디드 타입이다.왜냐하면 임베디드 타입은 만약 개발자가 setter 를 만들면 값 변경이 가능하기 때문이다.어떻게 임베디드의 참조 공유의 문제(두 객체가 하나의 참조를 바라볼 때, 참조의 실제값이 변경되어 두 객체의 값이 동시에 변경될 수 있는 문제)를 해결할 수 있을까?불변 객체를 만드는 것이다불변 객체는 말 그대로 한번 생성한 이후에 값을 변경하지 못하는 객체이다불변 객체를 만들기 위해1. 생성자로만 필드 초기화2. setter 금지를 준수하면 된다만약 값을 변경하고 싶다면 객체를 통째로 새롭게 만들어야 한다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.getReference() 이후에 em.find()를 해도 둘다 프록시 객체가 나오는 이유가 궁금합니다.
예전에 영속성 컨텍스트 강의를 들을 때는 JPA는 동일성을 보장하기 위해 같은 엔티티 타입과 PK로 조회를 하면 1차 캐시에 그 값이 있으면 반환된 객체도 동일하다고 배웠습니다. 이것과 마찬가지로, em.getReference(Member.class, member1.getId()) 로 DB로부터 조회하지 않고 참조값만을 가져와도 1차 캐시에 그 값이 올라오는건가요? 그래서 이후에 em.find(Member.class, member1.getId())를 해도 프록시 객체가 반환된 이유가 1차 캐시에 있는 참조값을 그대로 조회해서 그런가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
N:M 을 1:N N:1 로 풀면 이런 모습일까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네[질문 내용]안녕하세요. 항상 영한님의 강의를 수강하며 재밌게 공부하고 있습니다.질문이 있습니다.Item & Category 를다대다가 아니라일대다 다대일로 연관관계 매핑을 할 때중간테이블을 직접 만든다면 다음과 같이 만들면 되는걸까요? @Entity public class Item { @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; private String name; private int price; private int stockQuantity; @OneToMany @JoinColumn(name = "ITEM_ID") private List<CategoryItem> categoryItems = new ArrayList<>(); }@Entity public class CategoryItem { @Id @GeneratedValue @Column(name = "CATEGORY_ITEM_ID") private Long id; @ManyToOne @JoinColumn(name = "CATEGORY_ID") private Category category; @ManyToOne @JoinColumn(name = "ITEM_ID") private Item item; }@Entity public class Category { @Id @GeneratedValue @Column(name = "CATEGORY_ID") private Long id; private String name; @OneToMany @JoinColumn(name = "CATEGORY_ID") private List<CategoryItem> categoryItems = new ArrayList<>(); @ManyToOne @JoinColumn(name = "PARENT_ID") private Category parent; @OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>(); }
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
ManyToOne 설정 질문있습니다.
public class ReservationGoods extends BaseEntity { @ManyToOne @JoinColumn(name = "reservation_id") private Reservation reservation;}public class Reservation extends BaseEntity { @OneToMany(fetch = FetchType.LAZY,mappedBy = "reservation") private List<ReservationGoods> reservationGoods = new ArrayList<>(); }네이버 헤어 예약처럼 시간상품이 하나의 주문에만 들어갈 수 있고 주문 하나의 여러개의 상품을 신청할 수 있어서 지금 db설계가 상품: 주문이 다대일 상황입니다이게 상품이 생성될때는 주문관해서는 모르는상황이라이거는 어쩔 수 없이 주문1 : 상품다 로 단방향 연결밖에 답이 없을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계와 연관관계의 주인 2 - 주의점, 정리 질문
1. 11분 57초에 team. getMember().add(member); 구문이 있는데요. add()가 insert역할인가요?팀의 멤버를 조회해서 멤버를 추가하라는게 혹시 무슨 뜻인가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
@OnetoOne관계에서 실전 예제에서는 왜 외래 키 부분에 unique = true를 넣지 않았는지 궁금합니다.
우선 일대일 관계로 매핑된 Order와 Delivery 엔티티 코드는 다음과 같습니다.<Order 클래스> @OneToOne @JoinColumn(name = "DELIVERY_ID") private Delivery delivery;<Delivery 클래스> @OneToOne(mappedBy = "delivery") private Order order;일대일 관계를 명시하려면 외래키에 unique 제약조건을 추가해야 된다고 알고 있는데요. 이상한 점은 유니크 제약조건을 추가하지 않아도 아래와 같이 하이버네이트가 알아서 제약조건을 추가해줬다는 것입니다.왜 이런 현상이 발생한거죠?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
:단방향 연관관계 질문있습니다.
강의 :단방향 연관관계20분 55초에서 쿼리가 안나온다는게 create table Team ( TEAM_ID bigint not null, TEAM_NAME varchar(255), primary key (TEAM_ID) )이게 안나오느다는건가요?근데 persist로 db에 저장되서 안나온다고 하셨는데 12분에도 persist가 있는데도 쿼리가 나오는데요. 혹시 find 앞에 persist는 예외인건가요?try { Team team =new Team(); team.setName("TeamA"); em.persist(team);//영속 상태가 되면 pk값이 세팅 되고 영속 상태가 됨. Member member = new Member(); member.setUsername("member1");// member.setTeamId(team.getId());//연관관계 매핑 배우기 전 팀의 외래키를 만들어서 멤버에 조인함. em.persist(member); tx.commit(); }catch (Exception e){ tx.rollback(); }finally { em.close();//엔티티 매니저가 내부적으로 데이터베이스를 물고 동작을 함. } emf.close(); }단방향 연관관계 22분에서 em.flush(); em.clear();을 추가하면 영속성 컨테스트를 db로 보내버리고 동기화 상태에서 1차캐시가 빈상태로 조회가능하다는것은 알겠는데요.그래서 다른점이 혹시 아래 select문인가요?Hibernate: select member0_.MEMBER_ID as MEMBER_I1_0_0_, member0_.TEAM_ID as TEAM_ID3_0_0_, member0_.USERNAME as USERNAME2_0_0_, team1_.TEAM_ID as TEAM_ID1_1_1_, team1_.TEAM_NAME as TEAM_NAM2_1_1_ from Member member0_ left outer join Team team1_ on member0_.TEAM_ID=team1_.TEAM_ID where member0_.MEMBER_ID=?