كيفية استمرار كيان يحتوي على حقل نوع المستخدم باستخدام JPA2
سؤال
أنا أبحث عن وسيلة لاستمرار كيان يحتوي على حقل من نوع المستخدم. في هذا المثال بالذات ، أود أن أستمر TS الحقل مع عدد ميلي ثانية.
import org.joda.time.DateTime;
@Entity
public class Foo {
@Id
private Long id;
private DateTime ts;
}
المحلول
JPA ليس لديه القدرة على تسجيل أنواع المخصصات المخصصة ، عليك استخدام مواد محددة للمزود:
- بيات شتوى: http://joda-time.sourceforge.net/contrib/hibernate/
- Eclipselink: http://code.google.com/p/joda-tim-eclipselink-integration/
OpenJPA: http://issues.apache.org/jira/browse/openjpa-473 (لا يزال مفتوحا)
نصائح أخرى
نظرًا لأنه ليس من النوع المدعوم من JPA ، فإنك تعتمد على تفاصيل التنفيذ. يحتوي Datanucleus على مكون إضافي لـ Jodatime من شأنه أن يسمح باستمرارك المطلوب.
إما يمكنك استخدام هذه المواد المحددة للمزود أو يمكنك الاستفادة منها @PostPersist
, @PostUpdate
, @PostLoad
طرق رد الاتصال مع بديل @Transient
ميدان.
http://www.java2s.com/tutorial/java/0355__jpa/entitylistenerpostload.htm سوف يعطيك بعض الفكرة.
يرجى الشعور بالراحة للاتصال بأي توضيح إضافي.
أحد الحلول هو استخدام الخصائص غير العمود وتغليفها مع getters/setters.
لإخبار JPA باستخدام getters/setters بدلاً من تصنيف الحقول الخاصة مباشرة ، يجب عليك التعليق على id العام الطويل getid () بدلاً من معرف طويل خاص. عند القيام بذلك ، فقط تذكر استخدام transient لكل getter الذي لا يتوافق مباشرة مع العمود.
المثال التالي من شأنه إنشاء عمود تاريخ اسمه mydate, ، على الرغم من أن التطبيق سيكون له طرق DateTime GetTs () و SetTs () المتاحة له. (لست متأكدًا من API وقت DateTime ، لذا يرجى مسامحة أخطاء بسيطة :))
import org.joda.time.DateTime;
@Entity
public class Foo {
private Long id;
private DateTime ts;
@Id
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
// These should be accessed only by JPA, not by your application;
// hence they are marked as protected
protected Date getMyDate() { return ts == null ? null : ts.toDate(); }
protected void setMyDate(Date myDate) {
ts = myDate == null ? null : new DateTime(myDate);
}
// These are to be used by your application, but not by JPA;
// hence the getter is transient (if it's not, JPA will
// try to create a column for it)
@Transient
public DateTime getTs() { return ts; }
public void setTs(DateTime ts) { this.ts = ts; }
}