هل هناك مشكلة في كيانات JPA وOracle 10g وخصائص نوع التقويم؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أواجه السلوك المزعج للغاية التالي عند استخدام كيانات JPA بالتزامن مع Oracle 10g.

لنفترض أن لديك الكيان التالي.

@Entity
@Table(name = "T_Order")
public class TOrder implements Serializable {
    private static final long serialVersionUID = 2235742302377173533L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "activationDate")
    private Calendar activationDate;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Calendar getActivationDate() {
        return activationDate;
    }

    public void setActivationDate(Calendar activationDate) {
        this.activationDate = activationDate;
    }
}

تم تعيين هذا الكيان إلى Oracle 10g، لذلك سيكون هناك في قاعدة البيانات جدول T_ORDER مع عمود رقم المفتاح الأساسي "ID" وعمود TIMESTAMP "تاريخ التنشيط".

لنفترض أنني قمت بإنشاء مثيل لهذه الفئة بتاريخ التنشيط "15.سبتمبر 2008 00:00 صباحًا".منطقتي الزمنية المحلية هي CEST وهي GMT+02:00.عندما أستمر في هذا الكائن وحدد البيانات من الجدول T_ORDER باستخدام sqlplus، أجد أنه في الجدول بالفعل "14.سبتمبر 2008 الساعة 22:00" مخزنة، وهو أمر جيد حتى الآن، لأن المنطقة الزمنية لـ Oracle db هي GMT.

ولكن الآن الجزء المزعج.عندما قرأت هذا الكيان مرة أخرى في برنامج JAVA الخاص بي، اكتشفت أنه تم تجاهل المنطقة الزمنية لأوراكل وحصلت على "14.سبتمبر 2008 الساعة 22:00 بتوقيت وسط أوروبا الصيفي"، وهذا خطأ بالتأكيد.

لذلك، عند الكتابة إلى قاعدة البيانات، سيتم استخدام معلومات المنطقة الزمنية، وسيتم تجاهلها عند قراءتها.

هل هناك أي حل لهذا هناك؟أعتقد أن الحل الأكثر بساطة هو ضبط المنطقة الزمنية لـ Oracle dbs على GMT+02، لكن لسوء الحظ لا يمكنني القيام بذلك نظرًا لوجود تطبيقات أخرى تستخدم نفس الخادم.

نحن نستخدم التكنولوجيا التالية

Myeclipse 6.5 JPA مع سائق Hibernate 3.2 Oracle 10G Thin JDBC

هل كانت مفيدة؟

المحلول

يجب ألا تستخدم التقويم للوصول إلى التواريخ من قاعدة البيانات لهذا السبب بالتحديد.يجب عليك استخدام java.util.Date على هذا النحو:

@Temporal(TemporalType.TIMESTAMP)
@Column(name="activationDate")
public Date getActivationDate() {
    return this.activationDate;
}

java.util.Date يشير إلى لحظة زمنية، بغض النظر عن أي منطقة زمنية.يمكن استخدام التقويم لتنسيق تاريخ لمنطقة زمنية أو لغة معينة.

نصائح أخرى

لقد واجهت بالفعل نصيبي من المشاكل مع JPA والطوابع الزمنية.لقد كنت أقرأ في منتديات أوراكل ويرجى التحقق مما يلي:

  • يجب أن يكون الحقل الموجود في قاعدة البيانات TIMESTAMP_TZ وليس TIMESTAMP فقط
  • حاول إضافة التعليق التوضيحي @Temporal(value = TemporalType.TIMESTAMP)
  • إذا لم تكن بحاجة حقًا إلى المنطقة الزمنية، فأدخل حقل التاريخ أو الطابع الزمني.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top