Herkese merhaba. Projelerin sql sorgu karmaşıklığından kurtulmak için geliştirmekte olduğum projelerde jpa kullanmaya başladım. Implemantasyon olarakda standartların dışına fazla çıkmamak için eclipselink kullanıyorum. Fakat geliştirmekte olduğum iki projede mantık olarak şöyle bi sorunla karşılaştım; eğer bir sürü komposizyon ilişkisine sahip nesneleri kayıt etmeye çalışırken çeşitli problemler çıkıyor karşıma. Basit bir verecek olursam

@Entity
public class Lecture {
    @Id
    private int id;

    private String name;
    @OneToOne(cascade = CascadeType.PERSIST)
    private Teacher teacher;

    //getter and setter
}

@Entity
public class Teacher {
    @Id
    private int id;

    @Column(unique = true)
    private String code;
    private String name;

   //getter and setter  
}

Görüldüğü gibi iki adet entity nesnem mevcut ve örneğin web servis kullanarak jsondan gelen data ile bir Lecture nesnesi oluşturuyorum.

Lecture lecture = new Gson().fromJson(jsonSource, Lecture.class);

Benim sıkıntı çekitğim noktada işte ouşturduğum bu lecture nesnesini persist ederken nasıl bir strateji kullanmam gerektiği. lecture nesnesinin sahip olduğu teacher nesnesi yönetimli halde olmadığından dolayı ben burada lecture nesnesi direk persist etmek istediğimde o teacher nesnesi veri tabanında kayıtlı olduğu halde tekrar eklemeye çalışıyor dolayısıyla duplicate uniqe key hatası alıyorum. Aklıma gelen çözüm aşağıdaki gibi bir yöntem kullanarak lecture nesnesinin teacher nesnesi zaten veritabanında kayıtlıysa o nesneyi yönetimli hale getirmek ve ondan sonra bu lecture nesnesini persist etmek.

Teacher managedTeacher = findTeacherByCode(lecture.getTeacher().getCode());
if(managedTeacher != null) {
    lecture.setTeacher(managedTeacher);
}

Fakat bu yöntem ne kadar doğru yoksa benim izlediğim yöntem baştan mı yanlış? JPA ile tutorial düzeyinde bilgim olmasına karşın ilk defa projelerde kullanıyorum. Jpa'yı aktif olark kullanmış hocalarımdan tavsiyelerini bekliyorum.

soruldu: 26 Nis '15, 07:27

gurhan_kucuk's gravatar image

gurhan_kucuk
1914612
cevap kabul oranı: 0%

değiştirildi: 26 Nis '15, 08:46

problemi hall ede bildiysen dogru cevabi yaza bilirmisin?nerede düzenleme yaptin?

(28 Nis '15, 00:45) Serxan Serxan's gravatar image

Merhaba, Lecture ve Teacher tablolarınız arasında unidirectional(tek yönlü) bir bağlantı var.Bunun yerine bidirectional(iki yönlü) bağlantı kurarsanız sanki daha iyi olur gibi geldi bana.Bu sayede iki yönlü hareket edebilirsiniz. Duplicate unique key hatasını önlemek içinde aşağıdaki linkten faydalanarak JoinTable kullanabilirsin. Böylece id'ler bir ara tabloda tutulur.Burada hem Teacher hemde Lecture tablosunun ara sınıfla sahip olduğu association türünüde belirleyebilirsin.

Hibernate Join Table

permanent link

cevaplandı: 27 Nis '15, 06:30

ugurcanlacin's gravatar image

ugurcanlacin
816101625
cevap kabul oranı: 11%

1

Merhaba Uğur hocam cevabınız için teşekkür ederim. Bunu basit bir örnek vermek açısından yazdım tabiki böyle bir durumda çift yönlü bağlantı daha uygun olur. Fakat dediğiniz şekilde yaptığımda hala sorunu çözemedim ben. Join tablea eklerken herhangi bir sıkıntı yok fakat ben lecture nesnesini persist etmek istediğimde lecture nesnesinin sahip olduğu teacher nesnesinin veri tabanında kayıtlı olup olmadığına bakmaksızın tekrar eklemeye çalısıyor. Yani duplicate uniqe key hatasını teacher nesnesinin her defasında tabloya eklenmeye çalışıldığı için alıyorum

(28 Nis '15, 08:26) gurhan_kucuk gurhan_kucuk's gravatar image

Merhaba hocam tekrar, Senaryonuzu uygulamaya çalıştım ve sorununuzu şimdi anladım diyebilirim. Açıkcası benimde aklıma sizin yaptığınız yöntemden başka bir şey gelmedi. Bunun bir kontrolü var mı yok mu bende bilmiyorum. Hibernate konusunda bilgili hocalarımız bir el atarsa çok daha faydalı olacak.

(28 Nis '15, 16:03) ugurcanlacin ugurcanlacin's gravatar image
1

Tekrar merhaba Uğur hocam. Sınavlarım yüzünden epeydir bu sorunla ilgilenememiştim. Sorunu çözmenin diğer bir yolu ise idleri kullanmakmış.Eğer lecture nesnesine teacher nesnesini id siyle birlikte verip lecture nesnesini persist yerine merge edersem teacher nesnesini eklemeden önce o id de bir teacher nesnesi varmı ona bakıyor varsa güncelliyor yoksa ekliyor. Tabi teacher nesnesi sistemde ekliyse idsiyle beraber gönderiyorum değilse id yi null olarak gönderince yeni bir teacher nesnesi oluşturuyor. Şimdilik bu işimi gördü sorunu cevaplandı olarak kaydediyorum.

(03 May '15, 05:30) gurhan_kucuk gurhan_kucuk's gravatar image

Merhaba.

@OneToOne(cascade = CascadeType.PERSIST) 
private Teacher teacher;

OneToOne oldugu icin her bir lecture row-su için yeni bir teacher row-sunun olması gerektiğini düşünüyor. ManyToOne olması gerekiyor bence

eger lecture tablon şöyleyese:

id name teacher_id

o zaman aynı teacher-a bir kaç lecture uygun ola bilir.

@ManyToOne(cascade = CascadeType.PERSIST) 
private Teacher teacher;

yazmak şu demek: İçinde olduğun class yani Lecture Many ola bilir bir Teacher-a karşı

permanent link

cevaplandı: 27 Nis '15, 02:43

Serxan's gravatar image

Serxan
51691106107
cevap kabul oranı: 46%

değiştirildi: 27 Nis '15, 02:44

İlk başta yorumunuz için teşekkür ederim sağolun. İlk şunu belirteyim ki tablolardan entityleri olusturmak yerine entitiylerimi kendim yazıp tabloların ona göre oluşmasını tercih ettim. ManyToOne ın kullanım mantığını pek kavrayamıştım hatamı düzelttiğiniz içinde ayrı bir teşekkür ederim :). Fakat dediğiniz yöntemi uyguladığımda değişen pek bir şey olmadı. İlişki OneToOne olduğundada zaten aynı teacher birden fazla lectura uygun oluyordu.

(27 Nis '15, 04:21) gurhan_kucuk gurhan_kucuk's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×86
×14
×2

Soruldu: 26 Nis '15, 07:27

Görüntüleme: 606 kez

Son güncelleme: 03 May '15, 05:30

powered by BitNami OSQA