插入1:m关系java spring

时间:2017-04-30 17:31:52

标签: java spring jpa eclipselink

我有1:m的关系。我在一个帖子中发布关于“1”的数据以及关于“m”关系的数据。我想要实现的是将数据(m)插入“1”,然后将1持久保存到数据库中,该数据库应该在数据库中创建大约1和大约m的信息。

“1”活动:

 private List<OptionEntity> options;

    @OneToMany(mappedBy = "survey", cascade = CascadeType.MERGE)
    public List<OptionEntity> getOptions() {
        return options;
    }

    public void setOptions(List<OptionEntity> options) {
        this.options= options;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "survey_id", nullable = false)
    public int getSurveyId() {
        return surveyId;
    }

    public void setSurveyId(int surveyId) {
        this.surveyId = surveyId;
    }

“m”授权

私人SurveyEntity调查;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="survey_id")
public SurveyEntity getSurvey() {
    return survey;
}

public void setSurvey(SurveyEntity survey ) {
    this.survey = survey;
}

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name = "option_id", nullable = false)
public int getOptionId() {
    return optionId;
}

public void setOptionId(int optionId) {
    this.optionId = optionId;
}

然而当我做的时候

List<OptionEntity> ops = new ArrayList<>();
for( String option : options ){
    OptionEntity tmp_option = new OptionEntity();
    tmp_option.setText( option );
    ops.add(tmp_option);
}
survey.setOptions(ops);
surveyDAO.add(survey);

添加时

public void add ( SurveyEntity s )
{
  em.persist( s );
}

仅在数据库中创建“1”实体的记录。所有“m”实体的记录都没有插入数据库中。

我认为这里重要的是m个实体的身份设置为AUTO,因此数据库可以创建他们的id(它有自动增量)。

似乎我错了。

一次插入1:m关系的正确方法是什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

你必须做两件事:

1)设置双方的关系,因此在循环中将Survey实体添加到每个Option实体中:

       for( String option : options ){
           OptionEntity tmp_option = new OptionEntity();
           tmp_option.setText( option );
           ops.add(tmp_option);
           tmp_option.setSurvey(survey);
       }

2)使用em.merge()代替em.persist()或添加此级联选项:

@OneToMany(mappedBy = "survey", cascade = {CascadeType.MERGE, CascadeType.PERSIST})
public List<OptionEntity> getOptions() {
    return options;
}