2014-10-08 114 views
1

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

我对JPA注释非常新,所以不太确定我所做的是否正确。这个想法是有XBean的多个条目(即列表)与一个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 ... 
} 

我使用谷歌App Engine的存储

+0

这里'Key'的类型是什么? – erencan 2014-10-08 19:00:57

+0

'Key'是'com.google.appengine.api.datastore.Key'。我正在使用谷歌App Engine的存储 – S4beR 2014-10-08 19:02:46

回答

2

您需要cascade=CascadeType.PERSISTManyToOne,告诉Hibernate来持久YBean当它仍然存在XBean。

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

如果您的业务逻辑从未删除YBean,直到它没有被任何XBeans引用,但是如果您的业务逻辑不能阻止该情况,那么您应该级联或不根据是否想要摆脱XBeans或者是否要清除它们(但不要删除它们),以便不再引用被删除的YBean。

+0

使用'cascade = CascadeType.PERSIST'工作,但我没有理解你的第二行。请你详细解释一下 – S4beR 2014-10-08 19:50:56

+0

我已经编辑了答案来扩展这个解释。 – Tim 2014-10-08 19:59:46

+0

谢谢,现在很清楚。我想在我的情况''CascaseType.ALL''OneToMany'案件现在会做。 – S4beR 2014-10-08 20:04:27

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; 
+1

在这种情况下'FetchType.Eager'会做什么? – S4beR 2014-10-08 19:43:13

+0

这可以确保..当你加载一个对象时,它的所有孩子也将在这段时间内加载,而不是等待你拨打该电话 – 2014-10-08 19:53:16

+0

这是怎么解决OP的问题? – Tim 2014-10-08 20:00:21