2010-04-28 4 views
1

데이터베이스에 설정된 정확한 외래 키 제약 조건없이 다 대일 관계를 매핑하는 데 문제가 있습니다. MySQL 데이터베이스에서 OpenJPA 구현을 사용하지만 insert 및 select 문에 대해 생성 된 SQL 스크립트가 문제입니다.JoinColumn 이름이 SQL에서 사용되지 않았습니다.

나는 RootId 컬럼을 포함한 LegalEntity 테이블을 가지고있다. LegalEntityId 열이 nullable이 아니며 LegalEntity의 "RootId"열을 참조하는 값이 있지만 데이터베이스 제약 조건 (외래 키)이 설정되어 있지 않은 주소 테이블도 있습니다.

주소 엔티티 매핑됩니다 :


@Entity 
@Table(name="address") 
public class Address implements Serializable { 
    ... 

    @ManyToOne(fetch=FetchType.LAZY, optional=false) 
    @JoinColumn(referencedColumnName="RootId", name="LegalEntityId", nullable=false, insertable=true, updatable=true, table="LegalEntity") 
    public LegalEntity getLegalEntity() { 
     return this.legalEntity; 
    } 
} 

SELECT 문 (LegalEntity의 주소를 가져 오는) 삽입 한 Statment가 생성됩니다

SELECT t0.Id, .., t0.LEGALENTITY_ID FROM address t0 WHERE t0.LEGALENTITY_ID = ? ORDER BY t0.Id DESC [params=(int) 2] 

INSERT INTO address (..., LEGALENTITY_ID) VALUES (..., ?) [params=..., (int) 2]

내가 언급 한 문에서 테이블 속성이 생성됩니다 생략하면 :

SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId WHERE t1.Id = ? ORDER BY t0.Id DESC [params=(int) 2] 

INSERT INTO address (...) VALUES (...) [params=...] 

따라서 LegalEntityId는 다음 중 하나에 포함되지 않습니다. 진술.

데이터베이스에서 외래 키가없는 기본 키 이외의 열과 같은 참조를 기반으로 관계를 가질 수 있습니까? 누락 된 것이 있습니까?

미리 감사드립니다.

+0

"LegalEntityId가 명령문에 포함되어 있지 않습니다"라고 쓰십시오. 바로 위의 명령문은'SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId ...'입니다. LegalEntityId는 해당 JOIN 조건에 나타납니다. 그래서 무슨 뜻이야? 나는 이해하지 못한다. –

+0

죄송합니다. LegalEntityId가 SELECT 및 INSERT 문에 열 (INSERT INTO 주소 (..., LegalEntityId) VALUES (...))에 포함되어 있지 않습니다. – Vladimir

+0

좋습니다, 감사합니다. 'LegalEntity'의 클래스 정의, 생성 된 전체 SQL 및 코드를 생성 한 다음 엔티티에'persist()'또는'merge()'를 실행 해 주시겠습니까? 그건 그렇고, 당신은 속성'table = "LegalEntity"'를 제거하는 것이 옳았다. 그 속성 설정은 컬럼 "LegalEntityId"를 테이블 "LegalEntity"에 강제합니다. 그러나 당신은 그것이'table' 속성이없는 디폴트 인'address' 테이블에 속한다고 말합니다. –

답변

0

FetchType을 eager로 변경해보십시오. OpenJPA는 getLegalEntity를 호출하여 요청 될 때까지 LegalEntity를 쿼리하지 않습니다.

또한 제약 조건이 없어야합니다 (누군가 틀렸을 경우 제발 누군가를 교정하십시오).

+0

아무 일도 없었지만 여전히 동일한 SQL을 생성합니다. – Vladimir

관련 문제