2012-09-28 7 views
5

मैं जेपीए के साथ खुद को परिचित करने की कोशिश कर रहा हूं इसलिए मैंने एक बहुत ही सरल परियोजना बनाई। मेरे पास एक यूजर क्लास और एड्रेस क्लास है। ऐसा प्रतीत होता है कि मुझे अपने उपयोगकर्ता वर्ग में पता जोड़ने के बावजूद दोनों को जारी रखना है?यदि उपयोगकर्ता में पता निहित है तो मुझे दोनों ऑब्जेक्ट्स को क्यों जारी रखना होगा?

उपयोगकर्ता:

import javax.persistence.*; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

@Entity 
@Table(name = "usr") // @Table is optional, but "user" is a keyword in many SQL variants 
@NamedQuery(name = "User.findByName", query = "select u from User u where u.name = :name") 
public class User { 
    @Id // @Id indicates that this it a unique primary key 
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server 
    private Long id; 

    @Column(length = 32, unique = true) 
    // the optional @Column allows us makes sure that the name is limited to a suitable size and is unique 
    private String name; 

    // note that no setter for ID is provided, Hibernate will generate the ID for us 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="user") 
    private List<Address> addresses; 

पता:

@Entity 
public class Address { 

    @Id // @Id indicates that this it a unique primary key 
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server 
    private Long id; 

    @Column(length=50) 
    private String address1; 

    @ManyToOne 
    @JoinColumn(name="user_id") 
    private User user; 

EntityManager:

EntityManager entityManager = Persistence.createEntityManagerFactory("tutorialPU").createEntityManager(); 

entityManager.getTransaction().begin(); 

User user = new User(); 
user.setName("User"); 

List<Address> addresses = new ArrayList<Address>(); 
Address address = new Address(); 
address.setAddress1("Address1"); 

addresses.add(address); 
user.setAddresses(addresses); 
entityManager.persist(user); 
entityManager.persist(address); 
entityManager.getTransaction().commit(); 
entityManager.close(); 

शायद कुछ गलत कर ... बस यकीन नहीं यह क्या है?

किसी भी सुझाव की सराहना की जाएगी।

धन्यवाद,

एस

+2

http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html#cascade()। डिफ़ॉल्ट रूप से यह कैस्केड नहीं होता है, साथ ही यह भी वैकल्पिक है। –

उत्तर

10

एनोटेशन के लिए cascade तत्व की कोशिश करो।

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.PERSIST) 
private List<Address> addresses; 

documentation का कहना है कि डिफ़ॉल्ट रूप से कोई आपरेशन सोपानी है। यह भी बताता है कि कैस्केड ऑपरेशन वैकल्पिक है, इसलिए यह वास्तव में आपके द्वारा उपयोग किए जा रहे कार्यान्वयन पर निर्भर करता है।

साथ ही, संबंध स्थापित करते समय, सुनिश्चित करें कि आप रिश्ते के दोनों पक्ष निर्धारित करते हैं। पते पर उपयोगकर्ता और उपयोगकर्ता को पते सेट करें।

0

आप एक टोमनी एनोटेशन का उपयोग कर रहे हैं। मेरी समझ से आपको माता-पिता वर्ग (यूएसईआर) को जारी रखना होगा जब आप इसमें एक बच्चा वर्ग (पता) जोड़ना चाहते हैं।

उपयोगकर्ता कक्षा को बनाए रखने से, आप जानते हैं कि जेपीए को पता है कि कौन सी पंक्ति अपडेट होनी है।

5

आप इसके बारे में क्या बात कर रहे हैं जिसे कैस्केडिंग कहा जाता है। इसका मतलब है कि User में नेस्टेड ऑब्जेक्ट्स, जैसे Address पर एक ही क्रिया करना। डिफ़ॉल्ट रूप से, यदि आप CascadeType निर्दिष्ट नहीं करते हैं तो बिल्कुल कोई कैस्केडिंग नहीं है।

आप एक बार

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

पर विभिन्न झरना प्रकार परिभाषित कर सकते हैं या सिर्फ जेपीए बता हर आपरेशन झरना:

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = CascadeType.ALL) 
private List<Address> addresses; 

दोनों तरीकों में परिणाम होगा, उदाहरण के लिए, एक कायम Address जबकि एक बने User या संबंधित Address का विलोपन जब User हटा दिया गया है।

लेकिन! ... आप पहले उदाहरण से CascadeType.REMOVE निकालने के लिए, को निकालने में एक User को नहीं निकाला जाएगा उसके संबंधित Address (हटाने आपरेशन नेस्टेड वस्तुओं पर लागू नहीं किया जाएगा) है।

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

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