我有一个如下所示的bean结构。我面临的问题是尝试保留XBean时,我能够保存所有数据(即xName,pBean,qBean,rBean,kBean在存储中都可见),但是没有用于Y_BEAN的条目。

我对JPA注释非常陌生,因此不确定是否正确。这个想法是拥有多个XBean条目(即作为List)和一个YBean实例。

XBean还将YBean的一个实例作为其父对象,因此,当我检索XBean时,应该获取所有数据。 @ManyToOne注释有问题吗?

@Entity
@Table (name = "X_BEAN")
public class XBean implements XInterface {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    private String xName;

    @OneToOne(cascade=CascadeType.ALL)
    private PBean pBean;

    @ManyToOne
    @JoinColumn(name="y_id")
    private YBean yBean;

    @OneToOne(cascade=CascadeType.ALL)
    private qBean qBean;

    @OneToOne(cascade=CascadeType.ALL)
    private RBean rBean;

    @OneToMany (mappedBy="xBean", cascade=CascadeType.ALL)
    private List<KBean> kBeans;

    // getter setters for each are below ...
}


YBean的结构如下

@Entity
@Table (name = "Y_BEAN")
public class YBean implements XInterface {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @OneToOne(cascade=CascadeType.ALL)
    private ZBean zName;

    @OneToOne(cascade=CascadeType.ALL)
    private PBean pBean;

    @OneToOne(cascade=CascadeType.ALL)
    private RBean rBean;

    @OneToMany (mappedBy="yBean", cascade=CascadeType.ALL)
    private List<XBean> xBeans;

    // getter setter for each are below ...
}


我正在使用Google App Engine的存储空间

最佳答案

您需要在cascade=CascadeType.PERSIST上使用ManyToOne来告诉Hibernate在持久化XBean时持久化YBean。

您还应该考虑是否要在反OneToMany上使用层叠属性。使用CascadeType.ALL,如果要删除YBean的实例,则Hibernate将删除所有关联的XBean(其中可能有零个,一个或多个),因为CascadeType.ALL的意思是“将持久性操作(包括删除)应用于任何通过此属性或集合可访问的其他实体”。如果您没有CascadeType.ALL并且删除了一个或多个XBean所引用的YBean,则这些XBean现在将引用不存在的YBean ID,因此在这种情况下,您可能需要进行一些清理。

如果您的业务逻辑在没有任何XBean引用之前都不会删除YBean,则这两个选项都无关紧要,但是,如果您的业务逻辑没有阻止这种情况,那么您应该根据是否要摆脱这种情况而级联。 XBean或是否要清理它们(但不删除它们)以不再引用要删除的YBean。

07-26 02:14