2009-09-01 6 views
0

PHP 배경에서 가져온 ORM 매핑에 너무 익숙하지 않습니다. 일련의 질문과 그 가능한 대답 사이의 링크를 얻으 려합니다. 그 대답은 정답입니다.맵을 사용하여 Hibernate Annotations를 사용하여 기본 키를 생성합니다.

해당 답변에 대해 질의 할 수있는 Question 객체를 만들려고하지만 불행히도 내가 만든 최고의 Java 클래스가 중복 된 (기술적으로 불필요한) 필드로 연결됩니다.

이상적인 데이터베이스 스키마는 다음과 같이 보일 것이다 :

CREATE TABLE `question` (
    `question_id`   BIGINT AUTO_INCREMENT, 
    `questionText`   VARCHAR(255), 
    `correctAnswerIndex` INT, 
    PRIMARY KEY (`question_id`), 
    INDEX correct_answer_idx (`question_id`, `correctAnswerIndex`), 
    FOREIGN KEY `correct_answer_idx` (`question_id`, `correctAnswerIndex`) REFERENCES answer(`question_id`, `index`) 
); 

CREATE TABLE `answer` (
    `question_id`   BIGINT, 
    `index`     INT, 
    `answerText`   VARCHAR(32), 
    PRIMARY KEY (`question_id`, `index`), 
    INDEX question_idx (`question_id`), 
    FOREIGN KEY `question_idx` (`question_id`) REFERENCES `question`(`question_id`) 
); 

불행하게도, 나는 목록에 대해 해요 자바 클래스는지도에 대한 (question_id, 인덱스)의 추가 세트를 작성합니다. 필드를 기본 키로 사용할 수 있으면이 방법을 사용할 수 있습니다. 또한 correctAnswer는 현재 ID를 사용하면 문제가되지 않을 경우 Question에 대한 불필요한 참조를 생성합니다.

@javax.persistence.Entity 
@javax.persistence.Table(name = "question") 
public class Question implements Serializable { 
    @Id 
    @TableGenerator(name = "question_seq", table = "hibernate_sequences", allocationSize = 5) 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "question_seq") 
    private Long id; 

    @ManyToOne(optional = false) 
    @JoinColumns({ 
     @JoinColumn(name = "correct_answer_index", referencedColumnName = "index"), 
     @JoinColumn(name = "correct_answer_question", referencedColumnName = "question_id") 
    }) 
    private Answer correctAnswer; 

    @CollectionOfElements(fetch = FetchType.LAZY) 
    @JoinTable(name = "answer", joinColumns = @JoinColumn(name = "question_id")) 
    @MapKey(columns = { @Column(name = "index") }) 
    private Map<Integer, Answer> answers = new HashMap<Integer, Answer>(); 

    @Column(length = 255) 
    private String questionText; 

    //... Accessors, Equals(), Hashcode(), etc... 
} 

@javax.persistence.Entity 
@javax.persistence.Table(name = "answer") 
@AssociationOverrides({ 
    @AssociationOverride(name = "pk.index", joinColumns = @JoinColumn(name = "index")), 
    @AssociationOverride(name = "pk.question", joinColumns = @JoinColumn(name = "question_id")), 
}) 
public class Answer implements Serializable { 
    @EmbeddedId 
    private AnswerPK pk = new AnswerPK(); 

    @Column(length = 32) 
    private String answerText; 

    //... Accessors, Equals(), Hashcode(), etc... 
} 

@Embeddable 
public class AnswerPK implements Serializable { 
    @ManyToOne 
    @ForeignKey(name = "answer_for_question") 
    Question question; 

    Integer index; 

    //... Accessors, Equals(), Hashcode(), etc... 
} 

어떤 도움이나 조언이 크게 감상 할 수있다 :

다음

내가 구조를 만드는 데 사용하고있는 클래스이다.

답변

0

답변에 Map이 아닌 List을 사용하고 index을 정렬 순서로 사용하십시오. 또한 복합 키를 사용하는 대신 각 응답에 고유 ID (질문과 마찬가지로)를 할당하십시오. Hibernate는이 ID를 index 객체 대신에 사용한다.

이 디자인의 유일한 단점은 정답이 실제로이 질문에 대한 답변 목록의 항목인지 확인해야한다는 것입니다. 긍정적 인 측면에서 보면 코드와 매핑이 훨씬 간단 해집니다.

+0

이것은 꽤 잘 작동하고 고맙게도 정답을 제약하는 것은 상대적으로 쉽습니다. 감사! –

관련 문제