Hibernate ManyToMany与其他列的关系

时间:2013-11-09 10:20:29

标签: java sql spring hibernate

我希望两个表之间具有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方法时,没有任何内容插入到连接表()中。 (仅在问题表中)

2 个答案:

答案 0 :(得分:0)

我想你忘了设置从QuestionBlockAssociationQuestionToQuestionBlock的持续操作的级联。

级联将确保在持久化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,intlong中引用它们?

相关问题