book, publication relation
@Entity(name = "Book")
@Table(name = "book")
public static class Book
implements Serializable {
@Id
@GeneratedValue
private Long id;
private String title;
private String author;
@NaturalId
private String isbn;
//Getters and setters omitted for brevity
}
Book은 관계에서의 부모쪽을 나타낸다.
isbn컬럼은 isbn컬럼은 비즈니스 키로 잘 사용할수 있기 때문에 @NaturalId로 맵핑 됩니다.
@Entity(name = "Publication")
@Table(name = "publication")
public static class Publication {
@Id
@GeneratedValue
private Long id;
private String publisher;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "isbn",
referencedColumnName = "isbn"
)
private Book book;
@Column(
name = "price_in_cents",
nullable = false
)
private Integer priceCents;
private String currency;
//Getters and setters omitted for brevity
}
Publication은 관계에서 자식이다.
기본적으로 @ManyToOne 연결에서는 부모측 엔터티 식별자가 자식의 외부키 열과 조인하는데 사용된다고 가정 되나, 비식별자 연관을 할때는 referencedColumnName을 사용하여 ManyToOne 관계를 설정하기 위해 부모측에 어떤컬럼이 사용되어야 하는지를 설정합니다.
Publication publication = entityManager.createQuery(
"select p " +
"from Publication p " +
"join fetch p.book b " +
"where " +
" b.isbn = :isbn and " +
" p.currency = :currency", Publication.class)
.setParameter( "isbn", "978-9730228236" )
.setParameter( "currency", "&" )
.getSingleResult();
assertEquals(
"amazon.co.uk",
publication.getPublisher()
);
assertEquals(
"High-Performance Java Persistence",
publication.getBook().getTitle()
);
JQPL쿼리를 실행
SELECT
p.id AS id1_1_0_, b.id AS id1_0_1_,
p.isbn AS isbn5_1_0_, p.currency AS currency2_1_0_,
p.price_in_cents AS price_in3_1_0_,
p.publisher AS publishe4_1_0_,
b.author AS author2_0_1_, b.isbn AS isbn3_0_1_,
b.title AS title4_0_1_
FROM publication p
INNER JOIN
book b ON p.isbn = b.isbn
WHERE b.isbn = '978-9730228236'
AND p.currency = '&'