Hibernate Ders 03 – @Embeddable ve @Embedded

Merhaba Arkadaslar ,
Bu yazimda @Embedded ve @Embeddable notasyonunu anlamaya calisip ornek uygulama yapmaya calisacagiz.

@Embeddable notasyonunu sinifimizin uzerinde tanimliyoruz, @Entity notasyonu yerine kullaniyoruz. Bunun anlami bu pojo sinifimiz diger @Entity sinifimiz icerisine gomulup (embed) kullanilabilir.
@Embedded notasyonunu ise @Entity notasyonumuzun oldugu sinifta @Embeddable sinifa referasta bulunur.

Ilk actigimiz proje uzerinden devam ediyorum ve yeni bir paket aciyorum.Yeni bir sinif olusturuyorum, adi Student olsun.

    private int studentId;
    private String studentName;
    private String studentSurname;

Getter/setter metotlarini generate ediyoruz, Netbeans yardimi ile.(kod kismina sag tiklayip insert code -> getter/setter -> hepsini tikleyip generate ! )

@Entity notasyonunu sinifimizin basina , @Id ve @GeneratedValue(strategy= GenerationType.AUTO)  notasyonunu yaziyoruz.

Tablomuzdaki alan adini degistirmek icin @Column(name=”yeni_isim”) notasyonunu kullanabiliriz.Ornegin;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="yeniID")
    public int getStudentId() {
        return studentId;
    }

Simdi Embeddable olacak sinifimizi olusturuyoruz, adi Address olsun.

    private String street;
    private String road;
    private String city;
    private String zipcode;

gibi alanlarimiz olsun, getter / setter larimizi olusturuyoruz.
Burada sinifizin basina, notasyon olarak @Entity degil @Embeddable notasyonunu koyuyoruz !

Simdi tekrar Student sinifimizi aciyoruz, yeni bir degisken tanimlayacagiz ve getter/ setterini olusturacagiz.Degiskenimiz asagida oldugu gibi Address sinifimiz turunden olacaktir.

private Address studentAddress;

Olusturdugumuz getter metotunun uzerine @Embedded notasyonunu ekleyelim.

    @Embedded
    public Address getStudentAddress() {
         return this.studentAddress;
    }


Student.java

package hibernate3_Embeddable;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 *
 * @author Levent
 */
@Entity
public class Student implements Serializable {

    private int studentId;
    private String studentName;
    private String studentSurname;
    private Address studentAddress;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "yeni_id")
    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getStudentSurname() {
        return studentSurname;
    }

    public void setStudentSurname(String studentSurname) {
        this.studentSurname = studentSurname;
    }

    @Embedded
    public Address getStudentAddress() {
        return studentAddress;
    }

    public void setStudentAddress(Address studentAddress) {
        this.studentAddress = studentAddress;
    }

}


Address.java

package hibernate3_Embeddable;

import java.io.Serializable;
import javax.persistence.Embeddable;

/**
 *
 * @author Levent
 */
@Embeddable
public class Address implements Serializable {

    private String street;
    private String road;
    private String city;
    private String zipcode;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getRoad() {
        return road;
    }

    public void setRoad(String road) {
        this.road = road;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

}

Artik haziriz, sonuclari gormek icin test edelim ! Yeni bir sinif daha olusturalim.StudentTest adinda. Burada bir onceki orneklerde yaptigimiz test siniflarindan birini copy-paste ile olusturabiliriz, sablon olarak ayni yapiyi kullanacagimiz icin problem olmaz.

StudentTest.java

package hibernate3_Embeddable;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 *
 * @author Levent
 */
public class StudentTest {

    public static void main(String[] args) {
        AnnotationConfiguration config = new AnnotationConfiguration();
        config.addAnnotatedClass(Student.class);
        //config.addAnnotatedClass(Address.class);
        config.configure("hibernate.cfg.xml");

         new SchemaExport(config).create(true, true);

        SessionFactory factory = config.buildSessionFactory();
        Session session = factory.getCurrentSession();
        session.beginTransaction();

        Address address1= new Address();
        address1.setStreet("Bizim Sokak");
        address1.setRoad("Istiklal Caddesi");
        address1.setCity("Istanbul");
        address1.setZipcode("34000");

        Student student= new Student();
        student.setStudentName("Levent");
        student.setStudentSurname("Erguder");

        student.setStudentAddress(address1); 

        session.save(student);
        session.getTransaction().commit();

    }
}

Dikkat ederseniz sinifimiz onceki test orneklerimizle sablon olarak ayni.

    config.addAnnotatedClass(Student.class);
    //config.addAnnotatedClass(Address.class);

Bu ornegimizde Student.java @Entity yapida oldugu icin addAnnotatedClass metoduna arguman olarak verilmek zorundadir. Yoksa suna benzer bir hata ciktisi aliriz :
Exception in thread “main” org.hibernate.MappingException: Unknown entity: hibernate3_Embeddable.Student

Address.java ise @Embeddable oldugu icin,  addAnnotatedClass metoduna arguman olarak verilmek zorunda degildir. Dilersek verebiliriz, sonucu degistirmez.

Simdi de StudentTest.java sinifimizi calistiralim ve olan biteni gorelim 🙂

hibernate3_table1

Gordugunuz gibi, tek bir tablomuz olustu, o da student tablosu, address tablomuz olusmadi, tum alanlari student tablosu icine gomduk.
Dikkat ederseniz id’ mizin adini degistirmistik yeni_id yapmistik

hibernate3_viewData

Gordugunuz gibi , Address sinifindaki alanlar  ve Student sinifindaki alanlar hep beraber kardes kardes durmaktadir 🙂

Yazimizin burada sonuna geliyoruz.

kaynak kodlar: HibernateTutorial_3

Herkese Bol Javali Gunler.
Be an oracle man, import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *