使用连接表的Hibernate一对一单向映射

时间:2014-10-11 07:30:16

标签: java sql hibernate jpa

我有以下表格结构 enter image description here 模型类是:

选择等级

@Entity
public class Choice {
@Id
  @GeneratedValue
  @Column(name="CHOICE_ID")
  private Long id;

  @Column(nullable=false)
  private String text;

}

问题类

@Entity
public class Question {
   @Id
   @GeneratedValue
   @Column(name="QUESTION_ID")
   private Long id;

   private String text;

   @Column(name="CAT_ID")
   private Long catId = 1l;

   @Column(nullable=false)
   private int difficulty;

   @Column(nullable=false)
   private int set;

   @OneToMany
   @JoinColumn(name="QUESTION_ID", referencedColumnName="QUESTION_ID")
   private List<Choice> choices;

   @OneToOne
   @JoinTable(name = "RIGHT_CHOICE", joinColumns = { @JoinColumn(name = "QUESTION_ID",              referencedColumnName = "QUESTION_ID") })
   private Choice rightChoice;
}

使用注释我希望在问题和选择之间建立一对多的关系。 问题与权利选择之间的一对一关系。如果两种关系都是单向的,那就更好了。

如果有人能提供更好的表格设置会很有帮助。

1 个答案:

答案 0 :(得分:2)

我认为您不需要 RightChoice 实体,因为您可以在 Choice 实体中包含一个布尔值。

@Table("CHOICE")
@Entity
class Choice {

<....>

@Column(name = "CORRECT")
private Boolean correct = false;

<....>


private Boolean getCorrect(){
   return correct;
}

}

当你构建一个问题时,在添加到问题列表之前,将其中一个选项设置为correct = true;

Choice choice = new Choice();
choice.setCorrect(true);
*<other choices are ommited intentionally>*
question.add(choice);
*<other adds are ommited intentionally>*

此外,您应该在问题实体中使用OneToMany(cascade = CascadeType.PERSIST)。这意味着持久性将EntityManager操作 PERSIST 传播(级联)到相关实体。