كيفية استمرار كيان يحتوي على حقل نوع المستخدم باستخدام JPA2

StackOverflow https://stackoverflow.com/questions/2492160

  •  21-09-2019
  •  | 
  •  

سؤال

أنا أبحث عن وسيلة لاستمرار كيان يحتوي على حقل من نوع المستخدم. في هذا المثال بالذات ، أود أن أستمر TS الحقل مع عدد ميلي ثانية.

import org.joda.time.DateTime;

@Entity
public class Foo {

  @Id
  private Long id;

  private DateTime ts;
}
هل كانت مفيدة؟

المحلول

JPA ليس لديه القدرة على تسجيل أنواع المخصصات المخصصة ، عليك استخدام مواد محددة للمزود:

نصائح أخرى

نظرًا لأنه ليس من النوع المدعوم من 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; }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top