【问题标题】:Inserting to 1:m relation java spring插入到1:m关系java spring
【发布时间】:2017-04-30 17:31:51
【问题描述】:

我有 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 关系的正确方法是什么?

感谢您的帮助

【问题讨论】:

  • 您只为合并操作配置了级联。不是为了坚持。因此,当您保留调查时,选项不会保留。您还忘记设置选项调查。

标签: java spring jpa eclipselink


【解决方案1】:

你必须做两件事:

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;
}

【讨论】:

  • 当我使用合并或那些级联时,它会抛出 SQL 错误:1064,SQLState:42000
  • 查询调用期间还是容器启动期间?
  • 查询调用期间
  • 我发现我的属性名称是mysql的保留字,我只是转义了名称,它可以工作,谢谢
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多