2014-06-13 4 views
1

JPA 2.0을 사용하여 Hibernate 4.3.5에서 최대 절전 모드를 사용하여 테이블을 자동 생성하려고했습니다.JPA 2.0 (Hibernate)은 @JoinTable을 사용하여 @OneToMany에 대한 잘못된 조인 테이블 PK를 생성합니다.

내 연락 엔티티에 다음과 같은 항목을 만들었습니다

/** 
* Address 
*/ 
@Valid 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinTable(name = "contact_address", joinColumns = @JoinColumn(name = "contact_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id")) 
@OrderColumn 
private List<Address> addresses; 

최대 절전 모드가 제대로 접촉 테이블을 만드는 것입니다,하지만 조인 테이블은 올바른 PK없이 생성됩니다

CREATE TABLE `contact_address` (
    `contact_id` bigint(20) NOT NULL, 
    `address_id` bigint(20) NOT NULL, 
    `addresses_order` int(11) NOT NULL, 
    PRIMARY KEY (`contact_id`), 
    UNIQUE KEY `UK_mvvtppjfu6d0lcjm83u5youn8` (`address_id`), 
    CONSTRAINT `FK_4fntyt0q2l6vkfg7t38pg4i94` FOREIGN KEY (`contact_id`) REFERENCES `contact` (`id`), 
    CONSTRAINT `FK_mvvtppjfu6d0lcjm83u5youn8` FOREIGN KEY (`address_id`) REFERENCES `address` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

여기에 나열된 PK는 contact_id이며 올바르지 않습니다. 그러면 여러 주소를 할당 할 수 없습니다. 오히려 PK는 contact_id, address_id의 복합 PK 여야합니다.

최대 절전 모드가 잘못되었거나 JPA 주석에 문제가 있습니까? 이것은 일방적 인 연관입니다.

기술적으로 말하면, @OneToMany에 대한 조인 테이블이 필요하지는 않지만 다른 엔티티 개체에서 Address 엔티티를 사용해야 할 경우 사용하기에 더 깨끗합니다. 모든 연결에 대한 테이블을 조인하십시오.

@ManyToMany 연관을 사용하여 솔루션을 해킹하고 조인 열에 고유 제한 조건을 지정하는 데 어려움을 겪었습니다.하지만 JPA에 문제가 있는지 또는 최대 절전 모드 버그인지 이해하려고합니다.

+0

왜 OneToMany 관계에 JoinTable이 필요합니까? ManyToMany는 내가 아는 한 JoinTable이 필요합니다. – shazin

+0

질문에 그것을 지정하지 않았지만 여러 다른 엔터티에서 Address 개체를 사용해야합니다. 따라서 OneToMany 일지라도 여기에서 조인 테이블을 사용하는 것이 더 명확합니다. –

답변

0

한 연락처에 주소가 많은 연락처와 주소 사이에 일대 다 관계가 필요한 경우. 다음은 결합 테이블이 없어도 충분합니다.

+0

기술적으로 작동하지만 내 조인 테이블이 수정되지 않습니다. :) 다른 엔티티에서 Address 엔티티를 사용해야 할 때 OneTMany이지만 JoinTable을 사용하고 싶습니다.이 경우 조인 테이블을 구조적으로 사용하는 것은 더 깨끗한 솔루션입니다. –