我有一个如下所示的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。