2014-10-08 6 views
1

У меня есть структура бобов, как показано ниже. Проблема, с которой я столкнулась, заключается в попытке сохранить XBean, я могу сохранить все данные (т. Е. XName, pBean, qBean, rBean, kBeans все видны в хранилище), но для Y_BEAN нет записи.JPA ManyToOne поле не сохраняется

Я довольно много нового с аннотациями 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

Какой тип 'Key' здесь? – erencan

+0

'Key'' 'com.google.appengine.api.datastore.Key'. Я использую хранилище Google App Engine – S4beR

ответ

2

Вы должны cascade=CascadeType.PERSIST на вашем ManyToOne, чтобы сказать, спящий режим, чтобы сохраняться YBean, когда он сохраняется XBean.

Вы также должны думать о том, хотите ли вы атрибут каскада на инверсном OneToMany. С CascadeType.ALL, если вы должны были удалить экземпляр YBean, Hibernate удалит все связанные XBeans (из которых может быть ноль, один или много), потому что CascadeType.ALL означает «применять операции сохранения, включая удаление, к любым другим объектам, доступным через это свойство или коллекция ». Если у вас не было CascadeType.ALL, и вы удалили YBean, на который ссылался один или несколько XBeans, тогда эти XBeans теперь ссылались на несуществующий идентификатор YBean, поэтому вам, вероятно, потребуется сделать некоторую очистку в этом случае.

Оба варианта не имеют значения, если ваша бизнес-логика никогда не удаляет YBean до тех пор, пока на XBeans не будет ссылаться, но если ваша бизнес-логика не предотвратит это событие, тогда вы должны каскадировать или не основываться на том, хотите ли вы избавиться от XBeans или вы хотите очистить их (но не удалить), чтобы больше не ссылаться на YBean, который удаляется.

+0

, используя 'cascade = CascadeType.PERSIST', но я не понял вашу вторую строку. пожалуйста, объясните немного подробно. – S4beR

+0

Я отредактировал ответ, чтобы развернуть это объяснение. – Tim

+0

спасибо, сейчас довольно ясно. Думаю, в моем случае 'CascaseType.ALL' для дела« OneToMany »будет делать пока. – 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