2014-10-08 3 views
1

다음과 같은 빈 구조가 있습니다. 내가 직면하고있는 문제는 XBean을 지속하려고 시도하는 동안 모든 데이터 (즉 xName, pBean, qBean, rBean, kBeans가 모두 저장소에 표시됨)를 저장할 수 있지만 Y_BEAN에 대한 항목이 없다는 것입니다.JPA ManyToOne 필드가 저장되지 않음

나는 JPA 주석을 거의 새롭기 때문에 내가 한 일이 맞는지 확실하지 않다. 아이디어는 YBean의 하나의 인스턴스와 함께 XBean의 여러 항목 (즉, List)을 갖는 것입니다.

XBean은 YBean의 인스턴스를 부모로 보유하므로 XBean을 검색 할 때 모든 데이터를 가져와야합니다. @ManyToOne 주석에 문제가 있습니까?

+0

여기에 '키'유형은 무엇입니까? – erencan

+0

'키'는 'com.google.appengine.api.datastore.Key'입니다. 나는'cascade = CascadeType.PERSIST'를 사용하여 Google App Engine의 스토리지 – S4beR

답변

2

당신은 그것이 지속되면 YBean을 유지하기 위해 Hibernate에게 알려, 당신의 ManyToOnecascade=CascadeType.PERSIST 필요 내가 구글 앱 엔진의 스토리지 사용하고

@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 ... 
} 

아래처럼
@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의 구조

입니다 XBean.

역도에 캐스케이드 속성을 사용할지 여부도 고려해야합니다 (OneToMany). CascadeType.ALL으로, YBean의 인스턴스를 삭제할 경우, Hibernate는 관련된 모든 XBean (0, 1, 또는 다수가있을 수 있음)을 삭제합니다. CascadeType.ALL은 "를 통해 지속성 작업을 삭제를 포함하여 적용 할 수 있습니다. 이 속성 또는 컬렉션 ". CascadeType.ALL이없고 하나 이상의 XBeans에 의해 참조 된 YBean을 삭제 한 경우 해당 XBeans는 존재하지 않는 YBean ID를 참조하게되므로이 경우에는 정리를해야 할 것입니다.

두 비즈니스 로직 모두 XBeans에서 참조하지 않을 때까지 비즈니스 로직에서 절대로 YBean을 삭제하지 않지만 비즈니스 로직이 해당 케이스를 방해하지 않는 경우 두 옵션 모두 관련이 없습니다. XBeans를 없애거나, 지우고 싶은 (삭제하지 않고) 지워지는 YBean을 더 이상 참조하지 않기를 원할 것입니다.

+0

을 사용하고 있지만 두 번째 라인을 이해하지 못했습니다. 좀 더 자세하게 설명해 주시겠습니까 – S4beR

+0

그 설명을 확장하기위한 답을 편집했습니다. – Tim

+0

감사합니다. 지금은 꽤 명확합니다. 내 경우에는'OneToMany'를위한'CascaseType.ALL'이 지금 당장 할 것입니다. – S4beR

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

+0

이렇게하면 ... 하나의 객체를로드 할 때 해당 자식을 모두 불러올 때 해당 시간에로드되지 않고 –

+0

에 대한 호출을 기다리는 대신 OP의 문제를 어떻게 해결할 수 있습니까? – Tim

관련 문제