もう 1 つの JPAContainer の質問です。今回はOneToMany
関係のコミットに関するものです。
@Entity(name="CLAZZES")
public class Clazz implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="CLAZZ_ID", nullable=false)
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@Column(name="NAME")
private String name;
@ManyToOne(optional=false)
@JoinColumn(name="YEAR_ID", referencedColumnName="YEAR_ID")
private Year year;
@OneToMany(mappedBy="clazz", targetEntity=CourseWork.class, fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval=true)
private Collection<CourseWork> courseWorks;
@OneToMany
private List<PupilCoursework> pupilCourseworks;
public Clazz() {}
// Getters & Setters
}
@Entity(name="COURSEWORKS")
public class CourseWork implements Serializable {
@Column(name="COURSEWORK_ID")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@Column(name="NAME")
private String name;
@Column(name="CLAZZ")
private long clazzID;
@ManyToOne(optional=false, fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name="CLAZZ_ID", referencedColumnName="CLAZZ_ID", insertable=true, updatable=true)
private Clazz clazz;
public CourseWork() {}
// Getters & Setters
}
すべてのクラスを表示するテーブルに JPAContainer を使用しています。ウィンドウで、既存のコースワークをこのクラスに追加できます。
を設定するClazz#courseWorks
と、変更はデータベースにコミットされません。
Vaadin テーブルでは値が正しく表示されているため、コンテナーは値を受け入れているようです。
私は明らかに clazz とコースワークの間に双方向の関係を持っていますが、コンテナーはこの唯一のフィールドの変更を基礎となる DB (Apache Derby) にコミットしていないようです。コンテナー内の他のフィールドは、期待どおりにコミットされます。
コンテナ内の対応する項目プロパティを適切に設定するためにあらゆることを試みました。例えば
// protected OptionGroup selectedClassWorks;
// upon submit of the form:
Collection<CourseWork> courseWorkItems = engine.getItems(selectedClassWorks.getValue());
clazz.getItemProperty("courseWorks").setValue(courseWorkItems);
私はそれが重要だとは思いませんが、もしそうなら: itemid のコレクションとCourseWork
オブジェクトのコレクションの間で前後に変換するオプション グループのコンバーターを使用しています。
EntityItem
別の方法として、のエンティティを取得して、そこにコレクションを設定しようとしました。
結果は同じままです。コンテナは問題ありませんが、データベースは問題ありません。