Önce kodları paylaşayım sonra sorunuma geleyim.

hibernate.cfg.xml

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/okul</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDorg.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">create</property>
    <mapping class="entity.Ogrenci"/>
    <mapping class="entity.Ders"/>
  </session-factory>
</hibernate-configuration>

Ogrenci.java

@Entity  public class Ogrenci    {  
    @Id
    private int ONo;
    private String Adi;
    private String Soyadi;
    private String DogumTarihi;
    @OneToMany(cascade = CascadeType.ALL)
    private Set<Ders> DersListesi=new HashSet<Ders>(0);
    //Getter ve Setter metodları  }

Ders.java

@Entity public class Ders { 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int DNo;
    private String Adi;
    //Getter ve Setter metodları   }

Main.java

public class main {

public static void main(String[] args) {
    BastanKayıtEkle();
    TekKayıtEkle();
}

public static void TekKayıtEkle(){
    try {
        Ogrenci ogr=new Ogrenci();
        ogr.setONo(9);
        ogr.setAdi("as");
        ogr.setSoyadi("sa");
        ogr.setDogumTarihi("01.01.2015");
        Ders d1=DersiGetir(1);
        ogr.getDersListesi().add(d1);
        SessionFactory sf=new Configuration().configure().buildSessionFactory();
        Session ses=sf.openSession();
        ses.beginTransaction();
        ses.save(ogr);
        ses.save(d1);      
        ses.getTransaction().commit();
        ses.close();
    } catch (Exception e) {
        System.out.println(e);
    }
}

public static void BastanKayıtEkle(){
    Ogrenci ogr=new Ogrenci();
    ogr.setONo(11);
    ogr.setAdi("kml");
    ogr.setSoyadi("hmo");
    ogr.setDogumTarihi("19.08.1990");

    Ders d1=new Ders();
    d1.setDNo(1);
    d1.setAdi("fizik");

    Ders d2=new Ders();
    d2.setDNo(2);
    d2.setAdi("matematik");

    ogr.getDersListesi().add(d1);
    ogr.getDersListesi().add(d2);

    SessionFactory sf=new Configuration().configure().buildSessionFactory();
    Session ses=sf.openSession();
    ses.beginTransaction();
    ses.save(d1);
    ses.save(d2);
    ses.save(ogr);
    ses.getTransaction().commit();
    ses.close();
} }

Şimdi sorunuma geleyim. göründüğü gibi 2 tablom var ve onetomany ilişkisi var main sınıfında 2 kere kayıt girşi yapıyorum BastanKayıtEkle(); fonksuyonunu kullanırken <property name="hibernate.hbm2ddl.auto">create</property> bu ayar bu şekilde TekKayıtEkle(); fonksiyonu kullanırken ise <property name="hibernate.hbm2ddl.auto">update</property> bu ayar bu şekilde kodu çalıştırınca hata vermiyor ama fizik dersi Ders tablosunda 2 kere ekleniyor farklı bi id ile TekKayıtEkle(); fonksiyonundaki ses.save(d1); kodunu silince yada update olarak değiştirince de hata veriyor. Yardımcı olabilicek misiniz acaba ?

soruldu: 05 Ağu '15, 16:02

ahmethmo's gravatar image

ahmethmo
120101521
cevap kabul oranı: 50%

değiştirildi: 14 Ağu '15, 14:54

yukardaki işlemi yaptığın fonksiyonun başında Transaction anotasyonu varmı ?

(06 Ağu '15, 03:56) ibrahim472 ibrahim472's gravatar image

Hala hatanın ne olduğunu bilmiyoruz. Karşılaştığın hatayı buraya yazmalısın. Konsol kısmındaki ilk hatayı koy en azından.

(09 Ağu '15, 11:51) ugurcanlacin ugurcanlacin's gravatar image

< property name="hibernate.hbm2ddl.auto"> create < /property>

Bu kod uygulama başlatıldığında veritabanını oluşturur. Eğer bu şekilde bırakırsan her seferinde oluşturacaktır. Update ile değiştirirsen var olan veritabanını tekrar oluşturmaz. İster update ile değiştir ister o satırı sil.

İkinci sorun için ise merge() komutunu kullanabilirsin. merge, eğer veritabanında o nesne var ise update işlemi yok ise insert işlemi yapar. Anlattığın senaryoya göre aklıma böyle bir çözüm yolu geldi. Birde bu örneğe göre sadece ogr nesnesini merge ile kaydet.Aşağıdaki kod yeterlidir.

ses.merge(ogr);
permanent link

cevaplandı: 05 Ağu '15, 16:50

ugurcanlacin's gravatar image

ugurcanlacin
816101625
cevap kabul oranı: 11%

değiştirildi: 05 Ağu '15, 16:50

yok olmadı acaba annotation larda mı bi sorun var ya ?

(05 Ağu '15, 17:42) ahmethmo ahmethmo's gravatar image

Daha detaylı cevap için kodu ve aldığın hatayı buraya yazmalısın.

(06 Ağu '15, 05:27) ugurcanlacin ugurcanlacin's gravatar image

Hocam hata mesajını bir yazsanız

permanent link

cevaplandı: 13 Ağu '15, 17:20

cengizhan_ozcan's gravatar image

cengizhan_ozcan
71446
cevap kabul oranı: 0%

Ya ben projeyle uğraştım sildim yenisini yaptım oldu. Ondan hatayı söyleyemiyorum ama sorunu buldum sanırım. ben burda ilişkiyi yanlış kurdum. bi öğrenci birsürü ders alabilir ama bi dersi 1 kişi alabilir olarak yapmışım. ikinci kayıt işleminde de dersi ikinci bi kişiye eklemeye çalışıyorum ondan hata veriyor sanırım. Eğer manytomany olsaydı düzgün çalışırdı proje

permanent link

cevaplandı: 14 Ağu '15, 14:53

ahmethmo's gravatar image

ahmethmo
120101521
cevap kabul oranı: 50%

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:

×1,077
×109
×2

Soruldu: 05 Ağu '15, 16:02

Görüntüleme: 671 kez

Son güncelleme: 14 Ağu '15, 14:54

powered by BitNami OSQA