2012-08-08 2 views
1

Hibernate의 EntityManager가 시작되고 엔티티 매핑을 검증 할 때 문제가 발생합니다. 내가 초안을 할 수있는 간단한 측면에서, 나는 네 개의 클래스를 다음 있습니다 :Hibernate가 잘못된 엔터티 외래 키를 유효화 함

@Entity 
@Table(name="abc_rule") 
public class Rule { 
    @Id 
    @Column(name="id") 
    private Integer id; 

    @ManyToOne 
    private RuleType ruleType; 
} 

@Entity 
@Table(name="abc_rule_type") 
@IdClass(RuleTypeKey.class) 
public class RuleType { 
    @Id 
    private String typeCode; 

    @Id 
    private String otherCode; 

    @Column(name="descr") 
    private String description; 
} 

public class RuleTypeKey { 
    @Id 
    @Column(name="type_cd") 
    private String typeCode; 

    @Id 
    @Column(name="other_cd") 
    private String otherCode; 
} 

@Entity 
@Table(name="abc_rule_type") 
public class RuleTypeSimple { 

    @Id 
    @Column(name="id") 
    private Integer id; 

    @Column(name="type_cd") 
    private String typeCode; 

    @Column(name="other_cd") 
    private String otherCode; 

    @Column(name="descr") 
    private String description; 
} 

최대 절전 모드가 시작되면, 나는 다음과 같은 예외가 얻을 :

외래 키 (FK4AD4C4B924F958E2를 : abc_rule [ruleType_type_cd, ruleType_other_cd 나는 일시적으로에 @Table 주석의 이름을 바꾸면])) 참조 기본 키로 열 같은 수의 (abc_rule_type [ID])

이 있어야합니다이 "abc_rule_type_123"이라면 Hibernate는 유효성을 검사하여 예상대로 매핑을 사용한다. 나에게 이것은 Hibernate가 참조되는 실제 클래스의 설정보다는 테이블 이름에 기반한 외래 키 매핑의 유효성 검사처럼 보인다.

여기서 Hibernate가 클래스를 기반으로 유효성을 검사하도록하는 것은 분명한 이유가 있습니까? 아니면 외래 키의 유효성을 검사하지 않고 내가 올바르게 한 것을 신뢰해야합니까?

두 가지 식별자 설정으로 클래스를 두 번 매핑해야하는 좋은 이유가 없다는 것을 알았습니다. 필자의 경우 동일한 db에서 동작하는 두 개의 서로 다른 프로젝트 코드가 병합되었습니다. 하나는 읽기 전용 방식으로 사용되므로이 비정상적인 매핑을 제거 할 수 있습니다. 불행히도 두 코드베이스 모두 해당 버전의 클래스를 감싸는 상당한 양의 코드를 가지고 있으며 리팩토링은 지금 당장은 피할 수있는 큰 사업이 될 것입니다.

답변

1

Hibernate는 ORM 도구이므로, OOP 규칙이나 모범 사례를 따르는 방법으로이를 활용해야합니다.

기본 키로 여러 개의 열을 사용하면 안됩니다. 완전히 수행하지 않으면 (예 : 고대 관계형 데이터베이스를 만들지 않았거나 누군가가 당신을 죽이려고하는 경우) 그리고 인간의 한계를 벗어난 경우) @EmbeddedId로 주석이 달린 @Embedable Id를 사용해야하며, 도 @Id annotation으로 모든 열에 주석을 추가하지 마십시오.

은 여기 EmbeddedId 예이다 : 나는 (당신은 적어도 그림 또는 테이블 스크립트를 게시 할 경우 도움이 될) 작성하려는 모델 무엇인지 모르겠지만, 한편 EmbeddedCompoundPrimaryKey Example

이 수정과 그것은 당신에게 더 많은 오류를주지해야합니다

@Entity 
@Table(name="abc_rule") 
public class Rule { 
    @Id 
    @Column(name="id") 
    private Integer id; 

    @ManyToOne 
    private RuleType ruleType; 
} 

@Entity 
@Table(name="abc_rule_type") 
//@IdClass(RuleTypeKey.class) <--I don't think this is right 
public class RuleType { 
    @EmbeddedId //Add this 
    private RuleTypeKey id; //And this 
    /* Remove this 
    @Id 
    private String typeCode; 

    @Id 
    private String otherCode;*/ 

    @Column(name="descr") 
    private String description; 
} 

@Embeddable //Add this 
public class RuleTypeKey { 
    //@Id <--remove this 
    @Column(name="type_cd") 
    private String typeCode; 

    //@Id <--remove this 
    @Column(name="other_cd") 
    private String otherCode; 
} 

@Entity 
//@Table(name="abc_rule_type") <--must be different table name 
@Table(name="abc_rule_type_simple") 
public class RuleTypeSimple { 

    @Id 
    @Column(name="id") 
    private Integer id; 

    @Column(name="type_cd") //Are this two colums a reference to 
    private String typeCode; //The RuleType too?? if so the must be 
          //The same as in class Rule (ManyToOne) 

    @Column(name="other_cd") 
    private String otherCode; 

    @Column(name="descr") 
    private String description; 
} 

+0

불행하게도, Hibernate는 외국 동안 동일한 예외를 throw (그것을 확인, 그것은 sintax 오류 몇 가지가있을 수 있습니다)을 시도하고 작동하는지 알려주세요 EmbeddedId를 사용할 때 핵심 유효성 검사 trategy. –

+0

편집 된 응답을 확인하십시오. 클래스를 구현해야하는 방법에 대한 예가 있습니다 (정확하게 모델을 작성하려는 것이 무엇인지 이해하는 데 도움이되지만) –

관련 문제