// 부모측
@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;
// 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 (getContentHolder() == null) {
setContentHolder(new ArrayList<String>());
}
getContentHolder().clear();
getContentHolder().add(content);
}
public String getContent() {
if (getContentHolder() == null || getContentHolder().size() == 0) {
return null;
}
return getContentHolder().get(0);
}
실제 클라이언트는 getCentent(), setContent() 메소드만 사용한다.
unique=true 조건 때문에 컬렉션임에도 단 한개의 값만 저장할 수 있다.
값을 수정할 경우, update 문이 아니라 delete/insert 문이 article_content_holder 테이블측에 수행된다.