Herkese merhaba, Spring ve Hibernate öğrenmeye çalışıyorum. Ufak bir blog projesi yapıyorum. Post tablomda user_id ve category_id birebir ilişki ile bağlı. Bu ilişkileri sadece foreign key oluşması amacıyla ekliyorum. Post tabloma her yeni kayıt eklediğimde user ve category tablolarına da kayıt ekleniyor. Post eklediğimde user ve category tablolarına kayıt eklenmemesini istiyorum. Bunu nasıl sağlarım?

soruldu: 05 Oca, 03:59

juanov's gravatar image

juanov
480465656
cevap kabul oranı: 25%

1

OneToOne ilişki kuruyorsunuz ve bir tarafa kayıt girip diğer tarafa girmemek istiyorsunuz. Mantık sorunu var.

(06 Oca, 01:49) Dkyc Dkyc's gravatar image

Dediğiniz gibi ortada bir mantık sorunu var galiba. Ben sadece Post tablomda user_id ve category_id olsun istiyorum ve bu foreign key ile bağlı olsun istiyorum. User ve Category tablosuna kayıt atma amacım yok onlar sabit kalmalı. Bu durumda nasıl bir kullanım gerekir?

(07 Oca, 03:23) juanov juanov's gravatar image

İlişkileri bu şekilde kurduğunuzda bir sorun yaşamamanız gerekiyor.

alt text

permanent link

cevaplandı: 05 Oca, 06:07

acemi's gravatar image

acemi
8953715
cevap kabul oranı: 35%

En mantıklı kullanım bu mudur? Yani kategori ve userda da blogları collection olarak tutmak. Bunu denediğimde tüm işlemlerde getCurrentSession kullanmama rağmen aynı anda birden fazla session açık olması ile ilgili bir hata aldım. Hatayı çözmeye çalışacağım.

(07 Oca, 03:28) juanov juanov's gravatar image

Sorun @Cascade annotationu ile alakalı , post sınıfının içerisindek, categori ve user tablolarına dokunulmasını istemiyorsan , eğer kullanıyorsan sil. @OneToOne(cascade = cascadeType.ALL) şu şekilde yazılmış bir kod varsada içinde cascade kısmını sil. Kodunu atsan daha yardımcı olabiliriz. Yanılıyorda olabilirim.

permanent link

cevaplandı: 05 Oca, 09:51

Qmer05's gravatar image

Qmer05
15541934
cevap kabul oranı: 0%

(cascade = cascadeType.ALL) kısmını silince hata alıyorum. Çözüm başka birşey olmalı diye düşünüyorum.

(07 Oca, 03:24) juanov juanov's gravatar image

Merhabalar,

    @OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="IL_KOD")
public Il getIl(){
    return this.il.get();
}
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="ILCE_KOD")
public Ilce getIlce(){
    return this.ilce.get();
}

Bu şekilde deneyebilirsiniz. Projemde uygulamış olduğum yöntemdir. Fetch type load edilmesiyle alakalı onu silerek de deneyebilirsiniz..`

permanent link

cevaplandı: 05 Oca, 14:39

aykutbaytop's gravatar image

aykutbaytop
256
cevap kabul oranı: 0%

Sondaki .get() leri anlamadım

(06 Oca, 01:44) Dkyc Dkyc's gravatar image

@Dkyc Sınıf değişkenleri Optional olarak tanımlı sanırım :)

(06 Oca, 02:22) acemi acemi's gravatar image

Aslında ben de sizinki gibi bir tanımlama kullanıyorum. Aşağıya kendi kodumu yorum olarak ekledim. Sizin bu gösterdiğiniz kod sonucunda il ve ilçe tablosuna kayıt atılmıyor mu?

(07 Oca, 03:33) juanov juanov's gravatar image

@Dkyc column verdiğim get/set metodlarının field larını javafx property olarak tutuyor (SimpleStringProperty, SimpleObjectProperty vs.) ve direk new operatörüyle oluşturuyorum. Ondan kaynaklı .get() metodu ile çağırmam gerekiyor. Siz çekirdek java kullanıyor iseniz return this.field; demeniz yeterli.

@juanov hayır hocam. Ben il ve ilçelerin bulunduğu listeyi direk sql ile database'e import ettim. Sonrasında jpa tarafında il ve ilçeyi ilişkilendirip listeledim.İlk başta hibernate ile bu şekilde yapmıştım çalışmıştı. Şuan eclipseLink kullanıyorum. Cascade type ı kaldırıp bir denermisiniz

(08 Oca, 07:22) aykutbaytop aykutbaytop's gravatar image

Bu tabloları bağlarken kullandığım kod:

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="USER_ID")
private User user;

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="CATEGORY_ID")
private Category category;

aykutbaytop un kullanımı ile aynı ama bende user ve category tablosuna da kayıt ekleniyor.

permanent link

cevaplandı: 07 Oca, 03:32

juanov's gravatar image

juanov
480465656
cevap kabul oranı: 25%

Neden cascade işlemini ALL kullanıyorsunuz, herhangi bir transactional işlemle bağımlı tüm nesnelerde(tablolarda) aynı işlemi yapıyorsunuz bu durumda..

Cascade -> ALL kaldırınca kayıt atmamasını beklerim.

Ek bilgi;

Diğer açıdan oneToOne default bağımlı nesneler için initialize ederken EAGER'dır, bunu LAZY olarak belirtmek avantajdır. @Transactional metod içerisinde, isteğe göre get ile alınması daha iyi bir yöntemdir.

(07 Oca, 05:26) Turgay Can Turgay%20Can's gravatar image
Cevabınız
toggle preview

powered by BitNami OSQA