2017-04-30 4 views
1

私は1:mの関係にあります。私は "1"についてのデータと "m"関係についても1つの投稿に投稿します。私が達成しようとしているのは、 "1"にデータ(m)を挿入し、次に1を約1と約mのデータベースに情報を作成するデータベースに保存することです。1:m関係に挿入するJavaスプリング

"1" Enitity:

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" entitites

プライベートSurveyEntity調査。アドオンは

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

あるとき、私は

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

を行う際

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

ただし、データベース内の "1" エンティティのための唯一のレコードを作成します。すべての "m"エンティティのレコードはデータベースに挿入されません。

ここで重要なことは、m個のエンティティに対してIDがAUTOに設定されているため、データベースがIDを作成できることです(オートインクリメントがあります)。

私は間違っているようです。

1:mリレーションに一度に挿入する正しい方法は何ですか?オプションの各エンティティに調査エンティティを追加し、ループ内のよう

1)は、両側の関係を設定します:ヘルプ

+0

マージ操作に対してのみカスケードを設定しました。永続的なものではない。したがって、調査を継続してもオプションは維持されません。また、オプションのアンケートを設定するのを忘れてしまった。 –

答えて

2

ため

おかげであなたは二つのことをしなければならない

 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()を使用するか、このCASCADEオプションを追加します。

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

私は、マージまたはそれらのカスケードを使用すると、クエリ呼び出し中またはコンテナ起動中に SQLエラー:1064、SQLState:42000 – Darlyn

+0

がスローされますか? –

+0

クエリ呼び出し中 – Darlyn

関連する問題