jpa
बुनियादी मानचित्रण
खोज…
पैरामीटर
| टिप्पणी | विवरण |
|---|---|
@Id | फ़ील्ड / कॉलम को इकाई की कुंजी के रूप में चिह्नित करता है |
@Basic | मार्क्स ने फ़ील्ड को एक मूल प्रकार के रूप में मैप करने का अनुरोध किया। यह आदिम प्रकार और उनके रैपर, String , Date और Calendar । एनोटेशन वास्तव में वैकल्पिक है यदि कोई पैरामीटर नहीं दिया गया है, लेकिन अच्छी शैली आपके इरादों को स्पष्ट करने के लिए निर्देशित करेगी। |
@Transient | क्षणिक के रूप में चिह्नित क्षेत्रों को दृढ़ता के लिए नहीं माना जाता है, बहुत सीरियलाइजेशन के लिए transient कीवर्ड की तरह। |
टिप्पणियों
हमेशा एक डिफॉल्ट कंस्ट्रक्टर की जरूरत होती है, वह है, पैरामीटरलेस। मूल उदाहरण में, कोई निर्माता निर्दिष्ट नहीं था, इसलिए जावा ने एक जोड़ा; लेकिन यदि आप तर्कों के साथ एक कंस्ट्रक्टर जोड़ते हैं, तो पैरामीटर रहित कंस्ट्रक्टर को भी जोड़ना सुनिश्चित करें।
एक बहुत ही साधारण इकाई
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Basic
int count;
}
गेटवे, सेटर आदि को संक्षिप्तता के लिए ommitted किया जाता है, लेकिन उन्हें वैसे भी JPA की आवश्यकता नहीं है।
यह जावा क्लास निम्न तालिका के लिए मैप करेगा (आपके डेटाबेस पर निर्भर करता है, यहां एक संभावित पोस्टग्रैप मैपिंग में दिया गया है):
CREATE TABLE Note (
id integer NOT NULL,
note text,
count integer NOT NULL
)
JPA प्रदाताओं का उपयोग DDL उत्पन्न करने के लिए किया जा सकता है, और संभवतः यहाँ दिखाए गए से अलग DDL का उत्पादन करेगा, लेकिन जब तक प्रकार संगत हैं, तब तक रनटाइम पर समस्याएँ नहीं आएंगी। डीडीएल के ऑटो-पीढ़ी पर भरोसा नहीं करना सबसे अच्छा है।
मैपिंग से ओमिटिंग फील्ड
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Transient
String parsedNote;
String readParsedNote() {
if (parsedNote == null) { /* initialize from note */ }
return parsedNote;
}
}
यदि आपकी कक्षा को ऐसे फ़ील्ड की आवश्यकता है जो डेटाबेस में नहीं लिखे जाने चाहिए, तो उन्हें @Transient रूप में चिह्नित करें। डेटाबेस से पढ़ने के बाद, क्षेत्र null हो जाएगा।
मानचित्रण समय और दिनांक
जावा में समय और तिथि कई अलग-अलग प्रकारों में आती है: अब ऐतिहासिक Date और Calendar , और हाल ही में LocalDate और LocalDateTime । और Timestamp , Instant , ZonedLocalDateTime और जोडा-टाइम प्रकार। डेटाबेस की ओर, हमारे पास time , date और timestamp (समय और दिनांक दोनों), संभवतः समय क्षेत्र के साथ या बिना।
जावा 8 से पहले की तारीख और समय
पूर्व जावा -8 प्रकार java.util.Date , java.util.Calendar और java.sql.Timestamp लिए डिफ़ॉल्ट मैपिंग SQL में timestamp है; java.sql.Date यह date ।
@Entity
class Times {
@Id
private Integer id;
@Basic
private Timestamp timestamp;
@Basic
private java.sql.Date sqldate;
@Basic
private java.util.Date utildate;
@Basic
private Calendar calendar;
}
यह पूरी तरह से निम्न तालिका में मैप करेगा:
CREATE TABLE times (
id integer not null,
timestamp timestamp,
sqldate date,
utildate timestamp,
calendar timestamp
)
यह इरादा नहीं हो सकता है। उदाहरण के लिए, अक्सर एक जावा Date या Calendar का उपयोग केवल तारीख (जन्म तिथि के लिए) का प्रतिनिधित्व करने के लिए किया जाता है। डिफ़ॉल्ट मैपिंग को बदलने के लिए, या केवल मैपिंग को स्पष्ट करने के लिए, आप @Temporal एनोटेशन का उपयोग कर सकते हैं।
@Entity
class Times {
@Id
private Integer id;
@Temporal(TemporalType.TIME)
private Date date;
@Temporal(TemporalType.DATE)
private Calendar calendar;
}
समकक्ष SQL तालिका है:
CREATE TABLE times (
id integer not null,
date time,
calendar date
)
नोट 1: @Temporal साथ निर्दिष्ट प्रकार DDL पीढ़ी को प्रभावित करता है; लेकिन आप सिर्फ Date @Basic एनोटेशन के साथ Date करने के लिए date प्रकार का नक्शा नक्शा भी कर सकते हैं।
नोट 2: Calendar केवल time नहीं बना रह time ।
जावा 8 के साथ दिनांक और समय
JPA 2.1 जावा 8 में प्रदान किए गए java.time प्रकारों के लिए समर्थन को परिभाषित नहीं करता है। JPA 2.1 बहुसंख्यक कार्यान्वयन इन प्रकारों के लिए समर्थन की पेशकश करते हैं, हालांकि ये सख्ती से विक्रेता एक्सटेंशन बोलते हैं।
DataNucleus के लिए, ये प्रकार केवल बॉक्स से बाहर काम करते हैं, और @Temporal एनोटेशन के साथ युग्मन संभावनाओं की एक विस्तृत श्रृंखला प्रदान करते हैं।
हाइबरनेट के लिए, यदि हाइबरनेट 5.2+ का उपयोग कर रहे हैं, तो उन्हें बॉक्स से बाहर काम करना चाहिए, बस @Basic एनोटेशन का उपयोग करना @Basic । यदि हाइबरनेट 5.0-5.1 का उपयोग कर रहे हैं, तो आपको निर्भरता को जोड़ने की आवश्यकता है org.hibernate:hibernate-java8 । प्रदान किए गए मैपिंग हैं
-
LocalDatedateLocalDate -
Instant,LocalDateTimeऔरZonedDateTimetimestamp
एक विक्रेता-तटस्थ विकल्प किसी भी जावा 8 java.time लिए एक जेपीए 2.1 AttributeConverter को परिभाषित करने के लिए होगा जो कि बनाए रखने के लिए आवश्यक है।
अनुक्रम के साथ इकाई आईडी प्रबंधित
यहां हमारे पास एक वर्ग है और हम चाहते हैं कि पहचान क्षेत्र ( userUid ) का मूल्य डेटाबेस में एक खोज के माध्यम से उत्पन्न हो। इस SEQUENCE को USER_UID_SEQ कहा जाता है, और इसे DBA द्वारा बनाया जा सकता है, या JPA प्रदाता द्वारा बनाया जा सकता है।
@Entity
@Table(name="USER")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="USER_UID_GENERATOR", sequenceName="USER_UID_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_UID_GENERATOR")
private Long userUid;
@Basic
private String userName;
}