JPAContainer不提交OneToMany

时间:2014-08-10 11:13:06

标签: jpa vaadin derby jpacontainer

另一个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的实体并在那里设置集合。

结果保持不变:容器没问题,数据库不行。

0 个答案:

没有答案