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

结果保持不变:容器正常,数据库不正常。

4

0 回答 0