2008-09-17 15 views
2

JPA varlıklarını Oracle 10g ile birlikte kullanırken aşağıdaki çok sinir bozucu davranışları yaşıyorum.JPA Varlıkları, Oracle 10g ve Takvim Türü özellikleriyle ilgili bir Sorun mu var?

Şu varlığa sahip olduğunuzu varsayalım. Birincil anahtar NUMARASI sütun "ID" ve zaman damgası sütun "activationDate" ile bir tablo T_ORDER olacak DB böylece

@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; 
    } 
} 

Bu işletme, Oracle 10 g eşleştirilir.

Bu sınıfın bir örneğini "15 Eylül 2008 00:00 AM" etkinleştirme tarihiyle oluşturduğumu varsayalım. Yerel saat dilimim GMT + 02: 00 olan CEST. Bu nesneyi sürdürdüğümde ve sqlplus kullanarak T_ORDER tablosundan veriyi seçtiğimde, tablodaki gerçekte "14. Sep 2008 22:00" nin saklandığını görüyorum, o zamana kadar tamam, çünkü oracle db zaman dilimi GMT'dir.

Ama şimdi can sıkıcı olan bölüm. Bu varlığı JAVA programıma geri okuduğumda, oracle zaman diliminin göz ardı edildiğini ve "14 Eyl 2008 22:00 CEST" in yanlış olduğunu öğrendim.

Temel olarak, DB'ye yazılırken, saat dilimi bilgisi kullanılır, okunurken göz ardı edilir.

Bunun için herhangi bir çözüm var mı? Tahminimce en basit çözüm, oracle dbs timezone'u GMT + 02'ye ayarlamak olurdu, ama ne yazık ki aynı sunucuyu kullanan başka uygulamalar olduğu için bunu yapamam.

Biz zaten JPA ve zaman damgaları ile ilgili sorunlar payımız oldu Hazırda 3.2 Oracle 10g ince JDBC sürücüsü

cevap

2

Veritabanından bu güne erişmek için tarihleri ​​tam olarak kullanmak için bir Takvim kullanmamalısınız. Çok olarak java.util.Date kullanmalıdır:

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

java.util.Date puan bir an için zamanda, bağımsız herhangi saat dilimi. Takvim belirli bir saat dilimi veya yerel ayar için bir tarihi biçimlendirmek için kullanılabilir.

0

ile aşağıdaki teknolojiyi

MyEclipse 6.5 JPA kullanın. Aşağıdaki oracle forums okuma ve kontrol ediniz oldum:

  • veritabanında alan TIMESTAMP_TZ ve sadece TIMESTAMP olmalıdır
  • açıklama @Temporal ekleyerek
  • deneyin (değeri = TemporalType.TIMESTAMP)
  • Saat dilimini gerçekten ihtiyacınız yoksa bir tarih veya zaman damgası alanı girin.
+0

Yanıtladığınız için teşekkür ederiz. Yukarıda bahsettiğiniz aynı oracle forum dizisine rastladım. Ne yazık ki verilen tüm çözümler EclipseLink denilen bir şeyle ilgilidir ve gerçekten yeni bir kalıcılık API uygulamasına geçmek istemiyorum. – huo73

+0

Açıklamalar JPA ek açıklamalarıdır, bu nedenle eclipselink'e özgü değildir. Onu hazırda bekletdim ve iyi çalışıyorlar. – JeroenWyseur

İlgili konular