另一个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)。容器中的其他字段按预期提交。
我已经尝试了一切来适当地设置容器中相应的item属性。 E.g。
// protected OptionGroup selectedClassWorks;
// upon submit of the form:
Collection<CourseWork> courseWorkItems = engine.getItems(selectedClassWorks.getValue());
clazz.getItemProperty("courseWorks").setValue(courseWorkItems);
我认为这不重要,但如果确实如此:我正在为选项组使用转换器,该转换器在itemid集合和CourseWork
对象集合之间进行转换。
作为替代方案,我也尝试获取EntityItem
的实体并在那里设置集合。
结果保持不变:容器没问题,数据库不行。