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 🙂
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
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
Leave a Reply