0

の複数のインスタンスを持つインスタンスとの@OneToManyJPA 関連付けがあります。CurriculumWorkExperience

私が抱えている問題は、 1 つのエンティティ マネージャー呼び出しで複数のWorkExperiencesと共に1 つのカリキュラムを永続化できるようにしたいということです。persist/save

HTMLフォームの通常のHTTP POSTからSpring MVCモデル属性のJavaコレクション/セットに来るWorkExperiencesのいくつかのインスタンスを接着する方法がわかりません...

まず第一に、これはまったく可能ですか?もしそうなら、それは良い考えですか?通常のHTTP POSTでデータのコレクション/配列を投稿できるhtmlの種類は何ですか?

CurriculumJPA エンティティ:

@Entity
public class Curriculum {
    ...
    @OneToMany
    private Set<WorkExperience> workExperiences;
    ...

WorkExperienceJPA エンティティ:

@Entity
public class WorkExperience {
...
4

1 に答える 1

1

はい、可能です。Spring MVC は、リスト/マップをフォーム値として送信することをサポートしています。機能する方法は、値に添え字を付けることです。リストの場合、次のようにリスト番号を使用します

<form:input path="myVal[1].property" />

そしてマップの場合、次のようなマップキーを使用します

<form:input path="myVal[key].property' />

これは、モデル属性にそのアイテムのリスト/マップがあることを前提としています。DTO を使用してエンティティに変換することをお勧めします。やり過ぎかもしれませんが、ビューがエンティティ オブジェクトを直接操作できるようにすることに問題があります。

また、注意してください: フォーム上のアイテムを動的に追加/削除するには、ビュー側のコーディングを行う必要があります。あなたが想像するように削除が機能しないので、これは本当に苦痛になる可能性があります. Spring MVC には、リスト/マップに追加したり、リスト/マップ内のアイテムを変更したりする機能がありますが、マップからアイテムを直接削除する方法は見つかりませんでした。私は通常、「削除」ブール値フラグを DTO に追加して削除を処理し、リスト/マップにそのアイテムの form:hidden 要素を追加するだけで削除を追跡し、サーバー側でリスト/マップをクリーンアップします。それ。

サーバー側ですべてのエンティティを取得したら、それらを保存する必要があります。これをより自動化したい場合は、親エンティティに次のような注釈を設定するだけです

@OneToMany(cascade=CascadeType.PERSIST)

利用可能なCascadeTypeがいくつかあるので、適切なものを選択してください。

于 2013-04-01T20:04:33.963 に答える