book, publication relationbook, 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 = '&'

+ Recent posts