데이터베이스에 설정된 정확한 외래 키 제약 조건없이 다 대일 관계를 매핑하는 데 문제가 있습니다. 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는 다음 중 하나에 포함되지 않습니다. 진술.
데이터베이스에서 외래 키가없는 기본 키 이외의 열과 같은 참조를 기반으로 관계를 가질 수 있습니까? 누락 된 것이 있습니까?
미리 감사드립니다.
"LegalEntityId가 명령문에 포함되어 있지 않습니다"라고 쓰십시오. 바로 위의 명령문은'SELECT t0.Id, ... FROM address t0 INNER JOIN legalentity t1 ON t0.LegalEntityId = t1.RootId ...'입니다. LegalEntityId는 해당 JOIN 조건에 나타납니다. 그래서 무슨 뜻이야? 나는 이해하지 못한다. –
죄송합니다. LegalEntityId가 SELECT 및 INSERT 문에 열 (INSERT INTO 주소 (..., LegalEntityId) VALUES (...))에 포함되어 있지 않습니다. – Vladimir
좋습니다, 감사합니다. 'LegalEntity'의 클래스 정의, 생성 된 전체 SQL 및 코드를 생성 한 다음 엔티티에'persist()'또는'merge()'를 실행 해 주시겠습니까? 그건 그렇고, 당신은 속성'table = "LegalEntity"'를 제거하는 것이 옳았다. 그 속성 설정은 컬럼 "LegalEntityId"를 테이블 "LegalEntity"에 강제합니다. 그러나 당신은 그것이'table' 속성이없는 디폴트 인'address' 테이블에 속한다고 말합니다. –