2012-02-25 11 views
7

मेरे पास हाइबरनेट के बारे में एक सामान्य सवाल है कि मैं लड़ रहा हूं।हाइबरनेट कैस्केड PERSIST

मैं कक्षा एक और कक्षा बी, जहां बी ए

पर निर्भर है मेरी कोड में है जब मैं em.persist (objOfTypeA) कहते हैं मैं डालने जा सकते हैं और दोनों तालिकाओं एएए और बीबीबी में डालने के लिए उम्मीद करेंगे है। यदि मैं मैन्युअल रूप से ए को ए आईडी प्राप्त करता हूं और इसे प्रत्येक ऑब्जेक्ट के लिए सूची में भरता हूं और फिर उस सूची को जारी रखता है, तो चीजें काम कर रही हैं। लेकिन मुझे उम्मीद है कि यह जादुई हाइबरनेट द्वारा होगा।

क्या मैं कुछ गलत कर रहा हूं? या क्या मैं बस हाइबरनेट की बहुत अधिक उम्मीद कर रहा हूं?

धन्यवाद

@Entity 
@Table(name = "AAA") 
@Veto 
public class A { 

    @Id 
    @GeneratedValue 
    @Column(name = "Id") 
    private Long id; 


    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    ... 

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
    private List<B> b; 
... 
} 

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId") 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false) 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

उत्तर

1

मैंने अंत में इसे काम किया। उदाहरण मैं दिया गया था या पाया की कोई भी मुझसे कहा था कि वास्तव में क्या गलत था, यह केवल मेरे अपने प्रयोग के बाद किया गया है कि मैं इस निष्कर्ष पर पहुंचा करने में कामयाब रहे:

के बजाय होने

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
private List<B> b; 

कि नहीं था ' काम नहीं यह किया काम (FK अभी भी शून्य के रूप में आ रहा था)

:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
@JoinColumn(name="AId") 
@NotNull 
private List<B> b; 
+0

यह मेरे लिए काम नहीं किया। समस्या यह है कि हाइबरनेट चाहता है कि ए को जारी रखने से पहले बी पर सेट किया जाए। यह काम किया: http://stackoverflow.com/questions/1795649/jpa-persisting-a-one-to- कई- संबंध –

0

वर्ग B नीचे के रूप में की मैपिंग संशोधित करें,

@Entity 
@Table(name = "BBB") 
@Veto 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    private Long id; 

    @NotNull 
    @Column(name="AId", updatable = false, insertable = false) 
    private Long aId; 

    @NotNull 
    @Column(name = "Name") 
    private Long name; 

    @JoinColumn(name = "AId", referencedColumnName="Id") 
    @ManyToOne(optional = false) 
    private A a; 
...  
} 

आप गलत जगह पर गुण updatable = false, insertable = false उपयोग कर रहे थे और मैं इसे ठीक कर दिया है।

here पढ़ें यह समझने के लिए कि वे कैसे काम करते हैं।

+0

हाय ManuPK, के लिए धन्यवाद अपने जवाब, लेकिन यह मेरी समस्या का समाधान नहीं किया। जारी रखने की कोशिश करते समय (ए) मुझे एक त्रुटि मिल रही है कि बी के लिए आईआईडी शून्य है। ConstraintViolationImpl {interpolatedMessage = 'शून्य नहीं हो सकता', propertyPath = सहायता, rootBeanClass = वर्ग com.test.model.B, messageTemplate = '{javax.validation.constraints.NotNull.message}'} मुझे यकीन है कि नहीं कर रहा हूँ यदि SQL सर्वर पक्ष पर मुझे पहचान के रूप में आईडी (ए और बी) दोनों होना चाहिए या हाइबरनेट उस पर ध्यान रखेगा? लेकिन मुझे लगता है कि यह ठीक है क्योंकि यह शिकायत नहीं कर रहा है कि यह एफके पर शिकायत कर रहा है। – WonkeyDonkey

+0

डीबी इस तरह देख रहा है: Table1: एएए ईद bigint रिक्त नहीं, नाम varchar (100) तालिका 2: बीबीबी ईद bigint रिक्त नहीं, सहायता bigint रिक्त नहीं, नाम varchar (100) धन्यवाद! – WonkeyDonkey

+0

मैं डीबी में वापस गया और एआईडी से 'नल नल' हटा दिया और बी 12 कक्षा में एआईडी से @ नॉटनुल हटा दिया। अब लगातार सफल है लेकिन जब मैं डीबी को देखता हूं। एएए सब अच्छा है, लेकिन बीबीबी एआईडी गायब है। सहायता .. – WonkeyDonkey

संबंधित मुद्दे