2012-01-22 10 views
6

मैं हाइबरनेट में नौसिखिया हूं। मैं निम्नलिखित कोड में व्यक्ति और PersonDetail इकाई के बीच एक-से-एक मानचित्रण नहीं बना कोशिश कर रहा था:मैप किए गए अर्थ का अर्थ एनोटेशन में विशेषता है?

@Entity 
public class Person { 

    private int personId; 
    private String personName; 
    private PersonDetail personDetail; 

    @OneToOne(mappedBy="person") 
    public PersonDetail getPersonDetail() { 
     return personDetail; 
    } 

    public void setPersonDetail(PersonDetail personDetail) { 
     this.personDetail = personDetail; 
    } 

    @Id 
    @GeneratedValue 
    public int getPersonId() { 
     return personId; 
    } 

    public void setPersonId(int personId) { 
     this.personId = personId; 
    } 

    public String getPersonName() { 
     return personName; 
    } 

    public void setPersonName(String personName) { 
     this.personName = personName; 
    } 
} 


@Entity 
public class PersonDetail { 

    private int personDetailId; 
    private String zipCode; 
    private String job; 
    private double income; 

    private Person person; 

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    public Person getPerson() { 
     return person; 
    } 

    public void setPerson(Person person) { 
     this.person = person; 
    } 

    @Id 
    @GeneratedValue 
    public int getPersonDetailId() { 
     return personDetailId; 
    } 

    public void setPersonDetailId(int personDetailId) { 
     this.personDetailId = personDetailId; 
    } 

    public String getZipCode() { 
     return zipCode; 
    } 

    public void setZipCode(String zipCode) { 
     this.zipCode = zipCode; 
    } 

    public String getJob() { 
     return job; 
    } 

    public void setJob(String job) { 
     this.job = job; 
    } 

    public double getIncome() { 
     return income; 
    } 

    public void setIncome(double income) { 
     this.income = income; 
    } 

} 

मैं चाहता हूँ कि PersonDetail स्वामित्व इकाई (मुझे पता है कि इसका उल्टा सही है होना चाहिए, लेकिन मैं तो बस परीक्षण करना चाहते हैं)। जो मुझे समझ में नहीं आता है वह मैपबीबी विशेषता का उपयोग है जिसे मैंने व्यक्ति इकाई में रखा है। यदि मैं इसे हटा देता हूं, तो मुझे निम्न त्रुटि मिलती है: "com.hibernate.onetoonemapping.PersonDetail के लिए प्रकार निर्धारित नहीं कर सकता: तालिका में: कॉलम के लिए व्यक्ति: [org.hibernate.mapping.Column (personDetail)]"

यह मैप किया गया क्या विशेषता है? मैंने पढ़ा है कि मैप किए गए गुण गैर-स्वामित्व वाले पक्ष पर रखा गया है। लेकिन यह वास्तव में क्या करता है?

उत्तर

7

इसका मतलब है कि एंटरसाइट्स के बीच संबंध पहले ही मैप किया गया है, इसलिए आप इसे दो बार नहीं करते हैं। मैपबीबी विशेषता का उपयोग करके आप बस "अरे यह वहां पर किया गया है" कहें।

3

आपके परिदृश्य में मैप्डबी विशेषता का कोई प्रभाव नहीं होना चाहिए।

मैं प्राथमिक कुंजी के नाम (यह "आईडी" से अलग है) के बारे में उलझन में था, लेकिन गैर-मानक नाम पहचानकर्ता (किसी भी तरह से अपेक्षित) के रूप में उपयोग करने से आप जिस समस्या का सामना कर रहे हैं उसका कारण नहीं है।

मैंने OneToMany और OneToOne एसोसिएशन के संदर्भ में मैप किए गए पैरा पैरामीटर के साथ प्रयोग किया है और मेरे निष्कर्ष साझा करना चाहते हैं। मेरे पास परीक्षण उद्देश्यों और प्रभाव को दर्शाने के लिए एक समान परिदृश्य है।

Person.class:

@Entity 
public class Person { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(name = "name") 
    private String name; 

    @OneToOne 
    private Address address; 
} 

Address.class (OneToOne परीक्षण के लिए):

@Entity 
public class Address { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(name = "address") 
    private String address; 


    @OneToOne(mappedBy="address") 
    private Person person; 

    @OneToMany(cascade = CascadeType.ALL) 
    private Set<Phone> phone = new HashSet<Phone>(); 
} 

Phone.class (के लिए OneToMany परीक्षण):

@Entity 
public class Phone { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToOne(optional = false) 
    private Person person; 

    @Column(name = "number") 
    private String number; 
} 

"मैप" के चारों ओर घूमकर mappedBy "स्वचालित रूप से हाइबरनेट एक मेज में शामिल होने का उपयोग करता है: edBy"

Hibernate: 
/* insert domain.Address 
    */ insert 
    into 
     Address 
     (id, address) 
    values 
     (default, ?) 
Hibernate: 
/* insert domain.Person 
    */ insert 
    into 
     Person 
     (id, address_id, name) 
    values 
     (default, ?, ?) 

OneToMany संघों मैंने पाया है कि यदि आप निर्दिष्ट नहीं करते के लिए OneToOne सहयोग के लिए पैरामीटर, किसी भी मामले में एसक्यूएल हाइबरनेट द्वारा निष्पादित बयान वही रहा " , जबकि "मैप्डबी" पैरामीटर के साथ एसोसिएशन को इकाई तालिका में एक अलग कॉलम के रूप में मैप किया गया है।

अगर मैं का उपयोग करें ...

@OneToMany(cascade = CascadeType.ALL) 
private Set<Phone> phone = new HashSet<Phone>(); 

... के साथ निम्नलिखित बयानों में से एक फोन प्रविष्टि परिणाम एक व्यक्ति persising निष्पादित करने के लिए:

Hibernate: 
/* insert domain.Phone 
    */ insert 
    into 
     Phone 
     (id, number, person_id) 
    values 
     (default, ?, ?) 
Hibernate: 
/* insert collection 
    row domain.Person.phone */ insert 
    into 
     Person_Phone 
     (Person_id, phone_id) 
    values 
     (?, ?) 
का उपयोग कर जबकि

...एक अलग संबंधपरक मॉडल है कि क्या एक संभवतः इस मामले में उम्मीद करेंगे के करीब है में

@OneToMany(mappedBy="id", cascade = CascadeType.ALL) 
private Set<Phone> phone = new HashSet<Phone>(); 

परिणाम:

Hibernate: 
/* insert domain.Phone 
    */ insert 
    into 
     Phone 
     (id, number, person_id) 
    values 
     (default, ?, ?) 
4

आप बनाना चाहते जब एक रिश्ता द्वि-दिशात्मक (सुलभ के दोनों ओर से इकाई) आपने गैर-स्वामित्व वाले पक्ष पर mappedBy का उपयोग किया क्योंकि आप केवल को एक बार रिश्ते को परिभाषित कर सकते हैं।

mappedBy हाइबरनेट को बताता है कि अपनी संस्थाओं के उदाहरण कैसे बनाएं और डेटा को लोड करें। इस कक्षा में उस क्षेत्र में फ़ील्ड नाम का उल्लेख करना चाहिए, जिसे आप एनोटेट कर रहे हैं, PersonDetail, जहां संबंध परिभाषित किया गया है।

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