문서의 이전 판입니다!
// 부모측 @Id @Column(name="id") @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @OneToOne(cascade = CascadeType.ALL, mappedBy="parent") @primaryKeyJoinColumn private Child child;
// 자식측 @Id @GenericGenerator(name = "foreign_one_to_one_generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "parent")) @GeneratedValue(generator = "foreign_one_to_one_generator") @Column(name = "parent_id") private Long id; @OneToOne(fetch = FetchType.LAZY) @PrimaryKeyJoinColumn(name = "parent_id", referencedColumnName = "id") private Parent parent;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "parent", optional = false, fetch=FetchType.LAZY) @PrimaryKeyJoinColumn private Child child;
optional=false
는 Hibernate XML 매핑시 constrained=true
와 같다.// Article 이라는 엔티티의 내용(content)를 LazyLoading하는 예제이다. @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "article_content_holder", joinColumns = @JoinColumn(name = "article_id", unique = true)) @org.hibernate.annotations.ForeignKey(name="fk_article_content_holder_id") @Column(name = "content", length = 1024) private List<String> contentHolder; public void setContent(String content) { if (contentHolder == null) { contentHolder = new ArrayList<String>(); } contentHolder.clear(); contentHolder.add(content); } public String getContent() { if (contentHolder == null || contentHolder.size() == 0) { return null; } return contentHolder.get(0); }
// Parent.java 에서 @OneToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.LAZY) @JoinColumn(name="child_id", nullable = false, unique = true, insertable = true, updatable = false) @org.hibernate.annotations.ForeignKey(name="fk_parent_child_id" private Child child; // Child.java 에서 @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Lob @Column(name="body", nullable=false) private String body; // 자식측에 Parent 로 가는 매핑을 넣지 말것. 그 경우 Lazy로 지정해도 부모값을 읽는 쿼리가 날라간다.