2012-03-20 12 views
14

मैंने कक्षा में DataTime का उपयोग करने का प्रयास किया। फ़ील्ड के ऊपर @Temporal(TemporalType.DATE) जोड़कर, मुझे कहने में त्रुटि मिली "एक टेम्पोरल प्रकार के लिए लगातार फ़ील्ड या प्रॉपर्टी java.util.Date, java.util.Calendar या java.util.GregorianCalendar" का होना चाहिए। मैं रूपांतरण को आगे और आगे पेश कर सकता हूं; setters और getters का उपयोग कर इस प्रकार है:जेपीए (eclipselink) के साथ जोडा समय का उपयोग कैसे करें?

@Temporal(TemporalType.DATE) 
private Calendar attendanceDate; 

public DateTime getAttendanceDate() { 
    return new DateTime(this.attendanceDate); 
} 

public void setAttendanceDate(DateTime attendanceDate) { 
    this.attendanceDate = attendanceDate.toCalendar(Locale.getDefault()); 
} 

लेकिन मुझे आशा है कि eclipselink मेरे लिए यह करने के लिए। मैं thro 'Persist Joda-time's DateTime via Hibernate चला गया है। उत्तर हाइबरनेट का उपयोग करने का सुझाव है, लेकिन मुझे eclipselink का उपयोग करना है। मैं DateTime ऑब्जेक्ट का उपयोग अपनी इकाई वर्ग में डीबी प्रतिनिधित्व के साथ BLOB के रूप में कर सकता हूं, लेकिन मुझे इसे Date के रूप में चाहिए। क्या jodatime-eclipselink जैसी कोई चीज है? या कोई अन्य सुझाव? सहायता के लिए धन्यवाद।

उत्तर

15

बेसिक है। आप इसका उपयोग कर सकते हैं, या अपने स्वयं के कनवर्टर को परिभाषित कर सकते हैं और @Convert, @Converter में EclipseLink के माध्यम से इसका उपयोग कर सकते हैं।

डीडीएल निर्माण के लिए, कनवर्टर को आरंभिक विधि को परिभाषित करना चाहिए और मैपिंग के फ़ील्ड पर java.sql.Timestamp पर टाइप सेट करना चाहिए।

ईक्लीप्स लिंक में इस पर एक बग (या मौजूदा के लिए वोट दें) लॉग ऑन करें, हमें जोडा के लिए समर्थन होना चाहिए।

+0

डीडीएल निर्माण के संबंध में, मेरी प्रारंभिक विधि में मेरे पास यह है: mapping.getField() .setSqlType (java.sql.Types.TIMESTAMP); हालांकि, मेरे डीबी में बनाया गया प्रकार वर्कर (255) है। कोई विचार क्या समस्या हो सकती है? –

+5

@kaciula मुझे इसे जोड़ने के द्वारा काम करने के लिए मिला : 'mapping.getField()। setType (java.sql.Timestamp.class); 'एचटीएच –

0

समाधान लिंक एक EclipseLink कनवर्टर को परिभाषित करता है Joda DATETIME से java.sql.Timestamp या तिथि को परिवर्तित करने के लिए यहां
joda-time-eclipselink-integration

+3

जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (http://meta.stackexchange.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। – oers

+0

मुझे वहां एक जार फ़ाइल मिली और इसकी बहुत कम जानकारी है। क्या मुझे जार फ़ाइल के अंदर एकमात्र कनवर्टर क्लास का उपयोग करना चाहिए? सहायता के लिए धन्यवाद! – Ahamed

+0

फिर भी जेपीए 'बीएलओबी' के रूप में एक कॉलम 'DATE' के रूप में नहीं बनाएगा :( – Ahamed

2

अहमद, आपने बताया कि यह आपके लिए काम नहीं कर रहा था। इसके अतिरिक्त आप इच्छित फ़ील्ड प्रकार परिभाषित करने के लिए कनवर्टर का इनिशियलाइज़ विधि ओवरराइड करने के लिए की जरूरत है:

@Override 
public void initialize(DatabaseMapping mapping, Session session) { 
    ((AbstractDirectMapping) mapping) 
      .setFieldClassification(java.sql.Timestamp.class); 
} 
4

मैं एक ही बात करना चाहता था, और वास्तव में चारों ओर Googling मुझे यहाँ का नेतृत्व किया। मैं इसे @Access एनोटेशन का उपयोग करके पूरा करने में सक्षम था। सबसे पहले, आप इस

@Access(AccessType.FIELD) 
public class MyClass 
{ 
    .... 

यह सब कुछ करने के लिए क्षेत्र पहुँच प्रदान करता है ताकि आप व्यक्तिगत रूप से खेतों टिप्पणी करने की जरूरत नहीं है की तरह वर्ग पर टिप्पणी करें। फिर आप जेपीए के उपयोग के लिए गेटर और सेटर बनाते हैं।

@Column(name="my_date") 
@Temporal(TemporalType.DATE) 
@Access(AccessType.PROPERTY) 
private Date getMyDateForDB() 
{ 
    return myDate.toDate(); 
} 

private void setMyDateForDB(Date myDateFromDB) 
{ 
    myDate = new LocalDate(myDateFromDB); 
} 

@Access(AccessType.PROPERTY) जेपीए को इन विधियों के माध्यम से बने रहने और पुनर्प्राप्त करने के लिए कहता है।

अंत में, आप क्षणिक रूप में अपने सदस्य चर चिह्नित करने के लिए इस प्रकार

@Transient 
private LocalDate myDate = null; 

यह रूप में अच्छी तरह मैदान से जारी रहती है की कोशिश कर रहा से जेपीए बंद हो जाता है चाहता हूँ।

जो आप करना चाहते हैं उसे पूरा करना चाहिए। वो मेरे लिए बहुत अच्छा था।

+0

हम सेवा स्तर (डीएओ) पर' myDate' तक कैसे पहुंच सकते हैं? इसमें एक म्यूटेटर और एक्सेसर नहीं हो सकता है (वे निजी हैं साथ ही 'myDateForDB' के लिए) – Tiny

+0

मुझे यकीन नहीं है कि मैं आपके प्रश्न को पूरी तरह से समझता हूं। आपके पास 'लोकलडेट माईडेट' के लिए सार्वजनिक गेटटर और सेटर हो सकता है। चूंकि कक्षा को '@Access (AccessType.FIELD)' के साथ एनोटेट किया गया है। जेपीए गेटटर और सेटर को बिल्कुल देखने वाला नहीं है । – dnc253

6

मैं उपयोग Joda समय eclipselink एकीकरण का प्रयास करें, लेकिन काम नहीं करते, problably मैंने कुछ गलत किया है,

तो मैं अधिक researchs बना दिया है और मैं इस लिंक http://jcodehelp.blogspot.com.br/2011/12/persist-joda-datetime-with-eclipselink.html पाया, वे कन्वर्ट करने के लिए @Converter एनोटेशन का उपयोग जोडा तिथि समय।

मैं कोशिश करता हूं और मेरे लिए काम करता हूं, मुझे उम्मीद है कि आपके लिए भी काम करता है।

+1

+1: वह लिंक इसे बहुत विस्तार से समझाता है :) –

1

निम्नलिखित एक काम उदाहरण जवाब विषय

असल तरीका सबसे आसान अपने इकाई में एक DateTime क्षेत्र के लिए EclipseLink @Converter उपयोग करने के लिए है में उपलब्ध पर आधारित है।

कनवर्टर उपयोग इस प्रकार दिखता है:

import org.eclipse.persistence.annotations.Convert; 
import org.eclipse.persistence.annotations.Converter; 
import javax.persistence.*; 
import org.joda.time.DateTime; 

@Entity 
public class YourEntity { 

    @Converter(name = "dateTimeConverter", converterClass = your.package.to.JodaDateTimeConverter.class) 
    @Convert("dateTimeConverter") 
    private DateTime date; 

और कनवर्टर ही:

import org.eclipse.persistence.mappings.DatabaseMapping; 
import org.eclipse.persistence.mappings.converters.Converter; 
import org.eclipse.persistence.sessions.Session; 
import org.joda.time.DateTime; 
import java.sql.Timestamp; 

public class JodaDateTimeConverter implements Converter { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Object convertDataValueToObjectValue(Object dataValue, Session session) { 
     return dataValue == null ? null : new DateTime(dataValue); 
    } 

    @Override 
    public Object convertObjectValueToDataValue(Object objectValue, Session session) { 
     return objectValue == null ? null : new Timestamp(((DateTime) objectValue).getMillis()); 
    } 

    @Override 
    public void initialize(DatabaseMapping mapping, Session session) { 
     // this method can be empty if you are not creating DB from Entity classes 
     mapping.getField().setType(java.sql.Timestamp.class); 
    } 

    @Override 
    public boolean isMutable() { 
     return false; 
    } 

} 

मैं आसान प्रति-और-चिपकाएं समाधान के उद्देश्य के लिए इस जोड़ने कर रहा हूँ।

0

Atais से उत्तर अच्छी तरह से काम करता है। इसके लिए एक अपग्रेड के नीचे।

आप इसे विश्व स्तर पर पंजीकृत करके @ कनवर्टर एनोटेशन को छोड़ सकते हैं। persitence इकाई में persistance.xml पर जोड़ें:

<mapping-file>META-INF/xyz-orm.xml</mapping-file> 

और सामग्री के साथ META-INF/xyz-orm.xml दायर:

<?xml version="1.0"?> 
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm" version="2.1"> 
    <converter class="pl.ds.wsc.storage.converter.JodaDateTimeConverter"/> 
</entity-mappings> 

यदि आपका कॉन्फ़िग फ़ाइल META-INF/orm.xml तो आप भी पहला कदम को छोड़ सकते हैं क्योंकि यह डिफ़ॉल्ट के लिए confing है सभी persitence इकाइयों।

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