사용자 도구

사이트 도구


java:jpa:one-to-one

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:jpa:one-to-one [2012/03/13 15:29]
kwon37xi [게시판 형태에서 게시글에 대해 @ElementCollection을 사용한 LazyLoading 구현]
java:jpa:one-to-one [2018/06/29 08:41] (현재)
kwon37xi [게시판 형태에서 게시글에 대해 One-To-One LazyLoading 구현]
줄 6: 줄 6:
 ===== Primary Key 기반 One-To-One JPA 2 방식 ===== ===== Primary Key 기반 One-To-One JPA 2 방식 =====
   * **[[http://docs.oracle.com/javaee/6/api/javax/persistence/MapsId.html|@MapsId]]**를 사용하라.   * **[[http://docs.oracle.com/javaee/6/api/javax/persistence/MapsId.html|@MapsId]]**를 사용하라.
 +  * ''MapsId''는 기본적으로 Composite Primary Key(Embeddable)의 일부만 관계에서 사용될때 ''value''에서 해당 property를 명시한다. 명시하지 않으면 전체 사용.
 +  * Hibernate에서 ''@MapsId''로 OneToOne 매핑시에 자식측에 ''@JoinColumn''이 필요하다.<code java>
 +@Entity
 +class MedicalHistory implements Serializable {
 +  @Id 
 +  @Column(name = "patient_id")
 +  Integer id;
  
 +  @MapsId
 +  @OneToOne
 +  @JoinColumn(name = "patient_id")
 +  Person patient;
 +}
 +
 +@Entity
 +class Person {
 +  @Id @GeneratedValue Integer id;
 +}
 +</code>
 +  * 주의! 양뱡향 매핑의 경우, **부모에 자식값을 설정하고, 자식에도 부모 값을 설정**해야 부모를 저장하면 정상적으로 자식도 저장된다.
 ===== Primary Key 기반 One-To-One JPA 1 방식===== ===== Primary Key 기반 One-To-One JPA 1 방식=====
 <code java> <code java>
줄 16: 줄 35:
  
 @OneToOne(cascade = CascadeType.ALL, mappedBy="parent") @OneToOne(cascade = CascadeType.ALL, mappedBy="parent")
-@primaryKeyJoinColumn+@PrimaryKeyJoinColumn
 private Child child; private Child child;
  
줄 38: 줄 57:
 ===== One-To-One 과 Lazy Loading ===== ===== One-To-One 과 Lazy Loading =====
   * One-To-One 에서는 Lazy Loading이 잘 작동하지 않는다.   * One-To-One 에서는 Lazy Loading이 잘 작동하지 않는다.
-    - 이유는 null 값이 가능한 OneToOne의 경우 프록시 객체로 감쌀 수 없기 때문이다.+    - **이유는 null 값이 가능한 OneToOne의 경우(''optional=true'' 상황)** 프록시 객체로 감쌀 수 없기 때문이다.
     - 만약 null 값이 가능한 OneToOne 에 프록시 객체를 넣는다면, 이미 그 순간 결코 null 이 아닌 프록시 객체를 리턴하는 상태가 돼 버리기 때문이다.     - 만약 null 값이 가능한 OneToOne 에 프록시 객체를 넣는다면, 이미 그 순간 결코 null 이 아닌 프록시 객체를 리턴하는 상태가 돼 버리기 때문이다.
     - 따라서 JPA 구현체는 기본적으로 One-To-One 관계에 Lazy 를 허용하지 않고, 즉시 값을 읽어 들인다.     - 따라서 JPA 구현체는 기본적으로 One-To-One 관계에 Lazy 를 허용하지 않고, 즉시 값을 읽어 들인다.
 +  * [[java:hibernate:lazy_to_one|@LazyToOne]] 참조
   * 참조   * 참조
     * [[http://community.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one|Some explanations on lazy loading (one-to-one) | Hibernate | JBoss Community]]     * [[http://community.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one|Some explanations on lazy loading (one-to-one) | Hibernate | JBoss Community]]
     * [[http://justonjava.blogspot.com/2010/09/lazy-one-to-one-and-one-to-many.html|Just on JAVA: Lazy one-to-one inverse relationships in Hibernate]]     * [[http://justonjava.blogspot.com/2010/09/lazy-one-to-one-and-one-to-many.html|Just on JAVA: Lazy one-to-one inverse relationships in Hibernate]]
 +    * [[http://netframework.tistory.com/430|Programming is Fun :: Hibernate에서 Bi-Direction @OneToOne 이용]] - 이 위키페이지 내용과 여기에 참조 링크등을 잘 정리한 글.
     * [[http://whiteship.me/?p=13301|하이버네이트 OneToOne 연관 관계 Lazy Fetching이 안 먹어!?]] : OneToOne 단방향 관계이고 부모측 테이블에 자식의 주키가 저장될 경우에는 null 여부와 무관하게 Lazy Loading이 된다는 사실에 대한 설명. 부모측 테이블에 값이 저장돼 있기 때문에 다른 테이블을 읽지 않아도 null 혹은 프록시 객체 주입을 결정할 수 있기 때문.     * [[http://whiteship.me/?p=13301|하이버네이트 OneToOne 연관 관계 Lazy Fetching이 안 먹어!?]] : OneToOne 단방향 관계이고 부모측 테이블에 자식의 주키가 저장될 경우에는 null 여부와 무관하게 Lazy Loading이 된다는 사실에 대한 설명. 부모측 테이블에 값이 저장돼 있기 때문에 다른 테이블을 읽지 않아도 null 혹은 프록시 객체 주입을 결정할 수 있기 때문.
-  * **결코 null 일 수 없는 One-To-One 관계**에서는 프록시를 설정하고 Lazy 로 작동하게 만드는 것이 가능하다. **optional=false** 를 지정한다(결코 Null일 수 없다는 뜻).+  * **결코 null 일 수 없는 One-To-One 관계(''optional=false'')**에서는 프록시를 설정하고 Lazy 로 작동하게 만드는 것이 가능하다. **optional=false** 를 지정한다(결코 Null일 수 없다는 뜻).
   * **아래 코드는 잘못되었다. PrimaryKeyJoin 의 경우에는 optional=false 일 경우에 데이터 저장 순서가 꼬여버린다. 정상적인 optional=false가 작동하려면 ForeignKey Join을 해야한다.**   * **아래 코드는 잘못되었다. PrimaryKeyJoin 의 경우에는 optional=false 일 경우에 데이터 저장 순서가 꼬여버린다. 정상적인 optional=false가 작동하려면 ForeignKey Join을 해야한다.**
   * <code java>   * <code java>
줄 55: 줄 76:
  
 ===== 게시판 형태에서 게시글에 대해 @ElementCollection을 사용한 LazyLoading 구현 ===== ===== 게시판 형태에서 게시글에 대해 @ElementCollection을 사용한 LazyLoading 구현 =====
 +  * Deprecated. see [[java:hibernate:lazy_to_one|@LazyToOne]]
   * 기본적으로 One-To-One의 LazyLoading이 난잡하므로 @ElementCollection에 Lazy를 이용하되, **컬렉션에 Unique 조건을 주므로써 딱 1개의 데이터만 들어갈 수 있도**록 처리한다.   * 기본적으로 One-To-One의 LazyLoading이 난잡하므로 @ElementCollection에 Lazy를 이용하되, **컬렉션에 Unique 조건을 주므로써 딱 1개의 데이터만 들어갈 수 있도**록 처리한다.
 <code java> <code java>
줄 88: 줄 110:
  
 ===== 게시판 형태에서 게시글에 대해 One-To-One LazyLoading 구현 ===== ===== 게시판 형태에서 게시글에 대해 One-To-One LazyLoading 구현 =====
 +  * Deprecated. see [[java:hibernate:lazy_to_one|@LazyToOne]]
   * ElementCollection 방식 추천.   * ElementCollection 방식 추천.
   * 게시판처럼 내용이 있지만, 목록에서는 내용을 보여주지 않는 경우 JPA 에서 내용 컬럼에 LazyLoading을 적용해도 현재의 JPA 구현체들이 필드 LazyLoading을 구현하지 못해서 결국 제목의 목록만 필요할 때도 내용까지 읽어들인다.   * 게시판처럼 내용이 있지만, 목록에서는 내용을 보여주지 않는 경우 JPA 에서 내용 컬럼에 LazyLoading을 적용해도 현재의 JPA 구현체들이 필드 LazyLoading을 구현하지 못해서 결국 제목의 목록만 필요할 때도 내용까지 읽어들인다.
java/jpa/one-to-one.1331620154.txt.gz · 마지막으로 수정됨: 2012/03/13 15:29 저자 kwon37xi