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...
}
어떤 도움이나 조언이 크게 감상 할 수있다 :
다음
내가 구조를 만드는 데 사용하고있는 클래스이다.
이것은 꽤 잘 작동하고 고맙게도 정답을 제약하는 것은 상대적으로 쉽습니다. 감사! –