MapsId
는 기본적으로 Composite Primary Key(Embeddable)의 일부만 관계에서 사용될때 value
에서 해당 property를 명시한다. 명시하지 않으면 전체 사용.@MapsId
로 OneToOne 매핑시에 자식측에 @JoinColumn
이 필요하다.@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; }
// 부모측 @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;
optional=true
상황) 프록시 객체로 감쌀 수 없기 때문이다.optional=false
)에서는 프록시를 설정하고 Lazy 로 작동하게 만드는 것이 가능하다. optional=false 를 지정한다(결코 Null일 수 없다는 뜻).@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 (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); }
@CollectionTable(uniqueConstraints = @UniqueConstraint(columnNames={“some_id”, “some_version”}))
형태로 복합키에 unique 조건을 줄 수 있다.// 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로 지정해도 부모값을 읽는 쿼리가 날라간다.