关于Hibernate数据库设计的查询

时间:2013-12-18 15:41:03

标签: java hibernate database-design jersey

我正在编写一个简单的Web应用程序,其中有一个User实体和一组预定义的问题,供用户回答。用户为这些问题提供的答案需要针对userId和questionId存储。经过一些谷歌搜索并在stackoverflow的帮助下,我按照以下方式设计了表格。

UserDetails(userId, userName)
QuestionMaster(questionId, question)
QuestionAnswer(userId, questionId, answer, date) PK(userId, questionId)

Hibernate实体类:

UserDetails.class

@Entity
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "user")
public class UserDetails {

private int userId;
private String userName;
private Collection<QuestionAnswer> listOfAnswers = new HashSet<QuestionAnswer>();

@XmlElement (name = "answer", type=QuestionAnswer.class)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.userDetails", cascade=CascadeType.ALL)
public Collection<QuestionAnswer> getListOfAnswers() {
    return listOfAnswers;
}

public void setListOfAnswers(Collection<QuestionAnswer> listOfAnswers) {
    this.listOfAnswers = listOfAnswers;
}

@XmlElement (name = "userId")
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public int getUserId() {
    return userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}

@XmlElement (name = "userName")
@Column(nullable=false)
public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}
}

QuestionMaster.class

@Entity
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="question")
public class QuestionMaster {

private int questionId;
private String question;
private Collection<QuestionAnswer> listOfAnswers = new HashSet<QuestionAnswer>();

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.questionMaster", cascade=CascadeType.ALL)
public Collection<QuestionAnswer> getListOfAnswers() {
    return listOfAnswers;
}

public void setListOfAnswers(Collection<QuestionAnswer> listOfAnswers) {
    this.listOfAnswers = listOfAnswers;
}

@XmlElement(name="quesId")
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public int getQuestionId() {
    return questionId;
}

public void setQuestionId(int questionId) {
    this.questionId = questionId;
}

@XmlElement(name="ques")
@Column(unique=true, nullable=false)
public String getQuestion() {
    return question;
}

public void setQuestion(String question) {
    this.question = question;
}   
}

QuestionAnser.class

@Entity
@AssociationOverrides({
    @AssociationOverride(name = "pk.questionMaster", 
    joinColumns = @JoinColumn(name = "QUESTIONID", nullable = false)),
    @AssociationOverride(name = "pk.userDetails", 
    joinColumns = @JoinColumn(name = "USERID", nullable = false)) })
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "answer")
public class QuestionAnswer {
private String answer;
private Date date;
private QuestionAnswerId pk = new QuestionAnswerId();

@EmbeddedId
public QuestionAnswerId getPk() {
    return pk;
}

@XmlElement (name = "question", type=QuestionMaster.class)
@Transient
public QuestionMaster getQuestionMaster(){
    return getPk().getQuestionMaster();
}

public void setQuestionMaster(QuestionMaster questionMaster){
    getPk().setQuestionMaster(questionMaster);
}

@Transient
public UserDetails getUserDetails(){
    return getPk().getUserDetails();
}


public void setUserDetails(UserDetails userDetails){
    getPk().setUserDetails(userDetails);
}

public void setPk(QuestionAnswerId pk) {
    this.pk = pk;
}

@XmlElement(name="ans")
@Column(nullable=false)
public String getAnswer() {
    return answer;
}

public void setAnswer(String answer) {
    this.answer = answer;
}

@XmlElement(name="date")
@Temporal(TemporalType.DATE)
@Column(name = "DATE", nullable = false, length = 10)
public Date getDate() {
    return date;
}

public void setDate(Date date){
    this.date = date;
}

}

QuestionAnswerId.class

@Embeddable
public class QuestionAnswerId implements Serializable {

private QuestionMaster questionMaster;
private UserDetails userDetails;

@ManyToOne (cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public QuestionMaster getQuestionMaster() {
    return questionMaster;
}

public void setQuestionMaster(QuestionMaster questionMaster) {
    this.questionMaster = questionMaster;
}

@ManyToOne (cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public UserDetails getUserDetails() {
    return userDetails;
}

public void setUserDetails(UserDetails userDetails) {
    this.userDetails = userDetails;
}
}

示例REST API输出:/ rest / users / 5

<user>
    <userName>xyz</userName>
    <userId>5</userId>
    <answer>
        <ans>xyz</ans>
        <date>2013-12-18T00:00:00+05:30</date>
        <question>
            <ques>What is your name</quesId>
            <quesId>5</quesId>
        </question>
    </answer>
    <answer>
        <ans>25</ans>
        <date>2013-12-18T00:00:00+05:30</date>
        <question>
            <ques>What is your age</ques>
            <quesId>6</quesId>
        </question>
    </answer>
</user>

您对此数据库设计的意见/建议将受到高度赞赏。我是Hibernate的新手,在这个过程中学习它。请建议是否有更好的方法来设计用户 - 问题 - 答案关系,以便响应XML看起来更优雅。

0 个答案:

没有答案
相关问题