插入 1:m 关系 java spring
Inserting to 1:m relation java spring
我有 1:m 关系。我 post 关于“1”的数据以及关于 "m" 关系的数据 post。我想要实现的是将数据( 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)设置两边的关系,所以在循环中给每个Option实体添加Survey实体:
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;
}
我有 1:m 关系。我 post 关于“1”的数据以及关于 "m" 关系的数据 post。我想要实现的是将数据( 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)设置两边的关系,所以在循环中给每个Option实体添加Survey实体:
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;
}