我希望两个表之间具有ManyToMany关系,并且连接表有一个额外的列。我跟着this tutorial,但仍然遇到错误。我正在使用Spring MVC和Hibernate 这是我的实体:有问题块和问题,以及它们之间的关联。 问题:
@Entity
@Table(name = "Question")
public class Question {
@Id
@GeneratedValue
int ID;
String title;
String description;
String Type;
String defaultValue;
boolean deleted;
boolean isDraft;
boolean visible;
Timestamp modifiedDate;
String modifiedBy;
@OneToMany(mappedBy = "question",fetch=FetchType.EAGER)
private Set<AssociationQuestionToQuestionBlock> questionBlocks;
//GETTERS, SETTERS, CONSTRUCTORS...
}
QuestionBlock:
@Entity
@Table(name = "Questionblock")
public class QuestionBlock {
@Id
@GeneratedValue
int ID;
String title;
String description;
boolean deleted;
boolean isDraft;
boolean visible;
Timestamp modifiedDate;
String modifiedBy;
@OneToMany(mappedBy="questionBlock")
private Set<AssociationQuestionToQuestionBlock> questions;
@ManyToMany(mappedBy="questionBlocks")
Set<Survey> surveys;
public void addQuestion(Question q, int pos){
AssociationQuestionToQuestionBlock association = new AssociationQuestionToQuestionBlock();
association.setQuestion(q);
association.setQuestionBlock(this);
association.setQuestionID(q.getID());
association.setQuestionBlockID(this.getID());
association.setPosition(pos);
if(this.questions==null){
Set<AssociationQuestionToQuestionBlock> questionBlocks = new HashSet<>();
questionBlocks.add(association);
this.questions=questionBlocks;
}else{
this.questions.add(association);
}
if(q.getQuestionBlocks()==null){
Set<AssociationQuestionToQuestionBlock> questionBlocks = new HashSet<>();
questionBlocks.add(association);
q.setQuestionBlocks(questionBlocks);
}else{
q.getQuestionBlocks().add(association);
}
}
}
协会
@Entity
@Table(name = "QuestionBlock_Question")
@IdClass(AssociationQuestionToQuestionBlockID.class)
public class AssociationQuestionToQuestionBlock {
@Id
private long QuestionBlockID;
@Id
private long QuestionID;
int Position;
@ManyToOne
@JoinColumn(name = "QuestionBlockID", updatable = false, insertable = false, referencedColumnName = "ID")
private QuestionBlock questionBlock;
@ManyToOne
@JoinColumn(name = "QuestionID", updatable = false, insertable = false, referencedColumnName = "ID")
private Question question;
}
AssociationID:
public class AssociationQuestionToQuestionBlockID implements Serializable {
private long QuestionID;
private long QuestionBlockID;
public int hashCode() {
return (int) (QuestionID + QuestionBlockID);
}
public boolean equals(Object object) {
if (object instanceof AssociationQuestionToQuestionBlockID) {
AssociationQuestionToQuestionBlockID otherId = (AssociationQuestionToQuestionBlockID) object;
return (otherId.QuestionID == this.QuestionID)
&& (otherId.QuestionBlockID == this.QuestionBlockID);
}
return false;
}
}
这是我的控制器:
@Controller
@RequestMapping("/")
public class TestingController {
SurveyService surveyService;
@RequestMapping("test")
public String test(Model model) {
Question q = surveyService.getQuestion(7);
QuestionBlock qb = new QuestionBlock("tesztblokk", "ee", "czadam");
qb.addQuestion(q,1);
surveyService.save(qb);
return "home";
}
}
之后,当我尝试调用Controller方法时,没有任何内容插入到连接表()中。 (仅在问题表中)
答案 0 :(得分:0)
我想你忘了设置从QuestionBlock
到AssociationQuestionToQuestionBlock
的持续操作的级联。
级联将确保在持久化QuestionBlock
实体时,新建和关联的AssociationQuestionToQuestionBlock
实体(处于暂态状态)也会保持不变。
public class QuestionBlock {
...
@OneToMany(mappedBy="questionBlock", cascade = CascadeType.PERSIST)
private Set<AssociationQuestionToQuestionBlock> questions;
答案 1 :(得分:0)
如果你想保留这个我不建议的设计,你必须将映射注释添加到AssociationQuestionToQuestionBlockID
的字段中,从ManyToOne关联中删除可插入和可更新的属性,并添加一个{ {1}}这些关联的注释。
但是,好的,简单的,更有效的,更简单的方法是将MapsId
实体视为所有其他实体,并为此实体使用自动生成的单列ID。如果要确保没有多个具有相同questionID-questionBlockId的实例,请使用唯一键约束。
顺便说一句:为什么你使用AssociationQuestionToQuestionBlock
作为实体的ID,int
在long
中引用它们?