还有另一个 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 和课程作业之间存在双向关系,但容器似乎并未将这个唯一字段的更改提交给底层数据库(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
' 实体并将集合设置在那里。
结果保持不变:容器正常,数据库不正常。