JPA ManyToOne字段未存储

时间:2014-10-08 18:58:44

标签: java spring hibernate google-app-engine jpa

我有一个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的存储空间

2 个答案:

答案 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;