我有一个bean结构,如下所示。我面临的问题是在尝试持久化XBean时,我能够保存所有数据(即xName,pBean,qBean,rBean,kBeans在存储中都可见)但是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的存储空间
答案 0 :(得分:2)
你的cascade=CascadeType.PERSIST
需要ManyToOne
,告诉Hibernate在持久保存XBean时保留YBean。
您还应该考虑是否需要反向OneToMany
上的级联属性。使用CascadeType.ALL
,如果要删除YBean的实例,Hibernate将删除所有关联的XBeans(其中可能有零个,一个或多个),因为CascadeType.ALL
表示&#34;应用持久性对通过该财产或集合可访问的任何其他实体的操作,包括删除,#34;。如果你没有CascadeType.ALL
而你删除了一个或多个XBeans引用的YBean,那么这些XBeans现在会引用一个不存在的YBean ID,所以你可能需要在那种情况下做一些清理。
如果您的业务逻辑在任何XBeans都没有引用之前永远不会删除YBean,那么这两个选项都是无关紧要的,但是如果您的业务逻辑没有阻止这种情况,那么您应该根据您是否需要级联或不级联摆脱XBeans或者是否要清理它们(但不要删除它们)以便不再引用被删除的YBean。
答案 1 :(得分:0)
@ManyToOne
@JoinColumn(name="y_id")
private YBean yBean;
what is the column y_id ?
what is the definition of it?
you can try removing @JoinColumn(name="y_id") and let JPA handle it.
and also add fetch = FetchType.EAGER like this.
@OneToMany (mappedBy="yBean", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private List<XBean> xBeans;