Java 未存储JPA ManyTone字段

Java 未存储JPA ManyTone字段,java,spring,hibernate,google-app-engine,jpa,Java,Spring,Hibernate,Google App Engine,Jpa,我有一个bean结构,如下所示。我面临的问题是,在尝试持久化XBean时,我能够保存所有数据(即xName、pBean、qBean、rBean、KBean都在存储中可见),但Y_BEAN没有条目 我对JPA注释非常陌生,所以不确定我所做的是否正确。其思想是用一个YBean实例拥有多个XBean条目(即作为列表) XBean还将YBean的一个实例作为其父实例,因此当我检索XBean时,我应该获取所有数据。@ManyToOne注释有什么问题吗 @Entity @Table (name = "X_B

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

我对JPA注释非常陌生,所以不确定我所做的是否正确。其思想是用一个YBean实例拥有多个XBean条目(即作为列表)

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 ...
}
@实体
@表(name=“X_BEAN”)
公共类XBean实现XInterface{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私钥;
私有字符串xName;
@OneToOne(级联=级联类型.ALL)
私人PBean PBean;
@许多酮
@JoinColumn(name=“y_id”)
私家侦探;
@OneToOne(级联=级联类型.ALL)
私人qBean;
@OneToOne(级联=级联类型.ALL)
私人RBean RBean;
@OneToMany(mappedBy=“xBean”,cascade=CascadeType.ALL)
私有列表kBeans;
//下面是每种类型的getter setter。。。
}
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 ...
}
@实体
@表(name=“Y_BEAN”)
公共类YBean实现XInterface{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私钥;
@OneToOne(级联=级联类型.ALL)
私人ZBean zName;
@OneToOne(级联=级联类型.ALL)
私人PBean PBean;
@OneToOne(级联=级联类型.ALL)
私人RBean RBean;
@OneToMany(mappedBy=“yBean”,cascade=CascadeType.ALL)
私有列表xBeans;
//下面是每种类型的getter setter。。。
}

我正在使用Google App Engine的存储

您需要
cascade=CascadeType.PERSIST
在您的
ManyToOne
上,告诉Hibernate在保持XBean时保持YBean

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

如果您的业务逻辑在未被任何XBeans引用之前从未删除某个Ybeans,那么这两个选项都是不相关的,但是如果您的业务逻辑没有阻止这种情况,那么您应该根据是否要清除XBeans或者是否要清理它们(而不是删除它们)进行级联不再引用正在删除的YBean。

@ManyToOne
@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;
@JoinColumn(name=“y_id”) 私家侦探; y_id列是什么? 它的定义是什么? 您可以尝试删除@JoinColumn(name=“y_id”),并让JPA处理它。 并像这样添加fetch=FetchType.EAGER。 @OneToMany(mappedBy=“yBean”,cascade=CascadeType.ALL,fetch=FetchType.EAGER) 私有列表xBeans;
这里的
Key
是什么类型的?
Key
com.google.appengine.api.datastore.Key
。我正在使用Google App Engine的storagewhat
FetchType.Eager
在这种情况下可以做什么?这确保了。。当您加载一个对象时,它的所有子对象也将在这段时间内加载,而不是等待您调用该对象,因为急切/懒惰获取优化本身就是一个复杂的主题;对于什么是正确的选择没有普遍的答案,OP也没有给出任何关于这种情况下需要什么的指示,因此,我不明白你怎么知道你急切的吸引人的建议会让事情变得更好而不是更糟。我一直在工作中处理急切/懒惰的问题,考虑到性能,在需要时使用合适的建议。我同意这是一个复杂的话题。但对于您的问题,为什么在检索XBEAN时没有看到加载的YBEAN实例(它是父对象)。这可能就是原因。我想你可能误解了这个问题。OP想知道当引用YBean的XBean被持久化时,为什么YBean没有被持久化。检索已经持久化的实体不是这里的问题。使用
cascade=CascadeType.PERSIST
有效,但我不理解您的第二行。你能详细解释一下吗?谢谢,现在已经很清楚了。我想在我的案例中,
cascascasetype。所有的
onetomy
案例现在就可以了。