5 Ağustos 2011 Cuma

Hibernate ile Abstract Sınıfı Veritabanına Kaydetme

Arkadaşlar Merhabalar,

Bugün size çok kısa ve yararlı bir bilgi vereceğim. Hibernate ile uğraşırken karşıma şu sorun çıktı, elimde 3 tane sınıf ve 1 tane abstract sınıf var. 3 sınıf da bu abstract sınıfı extend ediyor ve veritabanına kaydederken, bu sınıfların türüne göre kaydetmesini istiyorum. Örneğin,

AbstractClass a = new Class1();
session.save(a);

ise veritabanında Class1'in tablosuna kaydetmesini, Class2 ise başka bir tabloya kaydetmesini istiyorum. Bunun için, abstract sınıfın başındaki @Entity annotationunu silip aşağıdaki annotationu yazarız.

@MappedSuperclass

Böylelikle amacımıza ulaşmış olacağız. Umarım faydalı olur. Herkese kolay gelsin.

4 Ağustos 2011 Perşembe

Hibernate için İnternetteki Faydalı Linkler

Merhabalar,

Sizlerle internette bulduğum Hibernate ile alakalı faydalı linkleri paylaşmak istiyorum. Hem sizler faydalanmış olursunuz, hem de ben unutmamış olurum :)

- http://www.vaannila.com/index.html (Hibernate dahil birçok öğrenilmesi gereken konuları çok güzel bir şekilde anlatmış)
- http://www.roseindia.net/hibernate/
- Ve tabii ki.. http://www.hibernate.org (Siteen indirebileceğiniz user manual'i dikkatle okumanızı tavsiye ederim, böylelikle ezbere gitmektense öğrenerek ilerlemiş olursunuz)
- http://www.hiberbook.com/

Aklıma geldikçe bu listeyi kabartacağım :) Herkese kolay gelsin.

Hibernate - Annotation ile One-to-Many Mapping

Merhabalar,

Bugün Hibernate Framework'u ile one-to-many ilişkisi olan sınıfları veritabanımıza nasıl kaydeder ve çekeriz inceleyeceğiz.
Öncelikle, one-to-many nedir bunu inceleyelim. OOP terimlerinden olup, birden çoğa ilişki olarak Türkçeleştirilebilir. Bir örnekle açıklamak gerekirse, bir okulumuz var ve içinde öğrenciler var. Her öğrenciye ait bir veya daha fazla telefon numarası var. Bunu aşağıdaki şekilde gösterebiliriz.







Bu gibi bir durumu gerçeklemek için yazacağımız annotationları aşağıya kısaca yazıyorum, kodları koymak hayli uzun süreceği için.

  @OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
  @JoinTable(name="CAR_CITY",joinColumns={@JoinColumn(name="ID")},inverseJoinColumns={@JoinColumn(name="CITY_ID")})
    @MapKeyColumn(name="carkey")
 
    private Map<String, City> cityMap = new HashMap<String, City>();

List ve ArrayList objeleri için de yapmak için @MapKeyColumn kısmını çıkartmak yeterli olacaktır. şimdilik bu kadar.

Kolay gelsin.

3 Ağustos 2011 Çarşamba

Hibernate ile Java Projesi Geliştirme ve Inner Join Sorgusunu Gerçekleme

Herkese merhabalar,

Castor üzerinde uzunca bir süre çalıştıktan sonra, artık sıra popüler framework Hibernate'yi öğrenmeye gelmişti. Bu hafta başında çalışmaya başladığım Hibernate'de güzel tecrübeler elde ettim. Aşağıda Hibernate ile geliştirilmiş bir Java projesi var, bunu inceleyelim. Burada ilk gerçeklediğim örneklerden ziyade, son olarak yaptığım projeyi koymayı uygun gördüm, basitten değil de zordan başlamayı denemek lazım bir sefer de :)

Hibernate iyidir hoştur, basit select, insert, update ve delete querylerimizi çalıştırır sağolsun da, işim içine obje ilişkileri girdi mi biraz durum farklılaşıyor. Mesela iki adet tablonuz var ve bunlar arasında bir ilişki kurarak bir sorgu hazırlayacaksınız(mesela select * from t1 inner join t2 ... gibi). Bunu gerçeklerken öncekilerden farklı olarak SQL querysini olduğu gibi Java kodları arasına yazmamız gerekiyor, diğer türlü bu işlem gerçekleşmiyor. Query sınıfıyla yapınca inner join ... on ... kalıbını tanımıyor, bilmiyorum bu konuyu çözmek adına birşey yaptılar mı, dolayısıyla bu sorunu SQLQuery sınıfıyla çözüyoruz. Aşağıda daha net biçimde görülebilir.


Bu projede kullanılan kütüphaneleri de yazmakta fayda var, zira bazen eski ve yeni versiyon kütüphaneler bir arada çalışırken sıkıntı olabiliyor, doğru kütüphaneleri kullanmak burada önem kazanıyor.

- antlr-2.7.6.jar
- commons-collections-3.1.jar
- dom4j-1.6.1.jar
- hibernate-jpa-2.0-api-1.0.0.Final.jar
- hibernate3.jar
- javassist-3.9.0.GA.jar
- jta-1.1.jar
- ojdbc14.jar(Kullandığım veritabanı Oracle olduğu için bunu kullanıyorum, diğer veritabanları için farklı kütüphaneleri Google'dan bulabilirsiniz.)
- slf4j-api-1.5.8.jar
- slf4j-simple-1.5.8.jar

Şimdi gelelim kodlara.

Car.Java

package com.emre.model;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
 * @author gozenem
 *
 */
@Entity
@Table(name="CAR")
public class Car {
       @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="ID")
    private int id;   
    @Column(name="BRAND", nullable=false)
    private String brand;  
    @Column(name="MODEL")
    private String model;   
    @Column(name="PRODUCTIONDATE")
    private Date productionDate;  
    @Column(name="AMOUNT")
    private int amount;
    public Car(String brand, String model, Date productionDate, int amount) {
        super();
        this.brand = brand;
        this.model = model;
        this.productionDate = productionDate;
        this.amount = amount;
    }
    public Car() {
        super();
        // TODO Auto-generated constructor stub
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }
    public Date getProductionDate() {
        return productionDate;
    }
    public void setProductionDate(Date productionDate) {
        this.productionDate = productionDate;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getId() {
        return id;
    }   
    public void updateCar(Car car){
        this.amount = car.amount;
        this.brand  = car.brand;
        this.model = car.model;
        this.productionDate = car.productionDate;
    }
}



City.Java

package com.emre.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="CITY")
public class City {     private long id;     
    private String name;
    public City(String name) {
        super();
        this.name = name;
    }
    public City() {}
    @Id
    @GeneratedValue
    @Column(name="CITY_ID")
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    @Column(name="CITY_NAME", nullable=false)
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}


CarDAO.Java
package com.emre.dao;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.PropertyValueException;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import com.emre.model.Car;
import com.emre.model.City;
import com.emre.util.HibernateUtil;
public class CarDAO {
    private Session session;
    public void addCar(Car car){
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            session.save(car);
            session.getTransaction().commit();
        }
        catch(PropertyValueException ex){
            System.out.println("Marka boş olamaz !");
        }
        catch(HibernateException ex){
            session.getTransaction().rollback();
            ex.printStackTrace();
        }
        finally{
            session.close();
        }
    }
    public void deleteCar(int id){
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            Car car = (Car) session.get(Car.class, id);
            session.delete(car);
            session.getTransaction().commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            session.getTransaction().rollback();
            e.printStackTrace();
        }
    }
    public void updateCar(int id, Car newCar){
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            Car car = (Car) session.get(Car.class, id);
            car.updateCar(newCar);
            session.getTransaction().commit();
            session.flush();
            session.close();
        }
        catch(PropertyValueException ex){
            System.out.println("Marka boş olamaz !");
        }
        catch (HibernateException e) {
            // TODO Auto-generated catch block
            session.getTransaction().rollback();
            e.printStackTrace();
        }
    }
    @SuppressWarnings("finally")
    public Car searchCar(int id){
        Car car = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            car = (Car) session.get(Car.class, id);
            session.getTransaction().commit();
            session.flush();
            session.close();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            return car;
        }
    }
    @SuppressWarnings({ "unchecked", "finally" })
    public ArrayList<Object[]> searchCarList(){
        ArrayList<Object[]> cars = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.getTransaction().begin();
            SQLQuery query = session.createSQLQuery("Select * from Car c inner join City ci on c.Id = ci.City_Id");
            query.addEntity(Car.class);
            query.addEntity(City.class);
            cars = (ArrayList<Object[]>) query.list();
            session.getTransaction().commit();
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            session.close();
            return cars;
        }
    }
}



HibernateUtil.Java
package com.emre.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import com.emre.model.Car;
import com.emre.model.City;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;  
    static {
        try {
            sessionFactory = new AnnotationConfiguration()
                                .configure()
                                .addPackage("com.emre.model")
                                .addAnnotatedClass(Car.class)
                                .addAnnotatedClass(City.class)
                                .buildSessionFactory();
           
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">URLniz</property>
        <property name="hibernate.connection.username">Kullanıcı Adınız</property>
        <property name="hibernate.connection.password">Şifreniz</property>
        <property name="hibernate.connection.pool_size">10</property>
        <property name="show_sql">true</property>
        <property name="dialect">org.hibernate.dialect.OracleDialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>   <!-- Otomatik tablo olusturma -->
        <!-- Mapping files -->
<!--         <mapping class="Student" /> -->
    </session-factory>
</hibernate-configuration>



Main.Java
package com.emre.main;
import java.util.ArrayList;
import java.util.Date;
import java.util.List
import com.emre.dao.CarDAO;
import com.emre.model.Car;
import com.emre.model.City;
public class Main {
    public static void main(String[] args) {
        CarDAO cDao = new CarDAO();
        ArrayList<Object[]> cars = cDao.searchCarList();
    }
}


Annotations ile ilgili güzel bir link aşağıda.
http://www.jumpingbean.co.za/blogs/mark/hibernate_hql_inner_join_on_clause 

Ayrıca, yukarıdaki projeyi geliştiriken faydalandığım linki de vermeden geçmek olmaz.
http://loianegroner.com/2010/06/hibernate-3-annotations-tutorial/ 

Kafanıza takılan birşeyler olursa sorabilirsiniz. Herkese kolay gelsin.

29 Temmuz 2011 Cuma

Castor ile HashMap objesini XML'e Çevirme ve Geri Oluşturma

Merhabalar,

Bugün Castor ile projelere devam ettim. Bu sefer önümdeki problem sınıfın içinde başka bir sınıf objelerini tutan hashmap objesini nasıl XML'e aktarırım ve oradan geri nasıl okurum(marshalling ve unmarshalling) oldu. Bunu küçük bir araştırma ve denemelerden sonra çözdüm. Burada olayı nested class olarak çözmeye çalışmamız gerekiyor. mapping.xml i aşağıya koyuyorum daha anlaşılır olacaktır.

mapping.xml

<?xml version="1.0"?>
<mapping>
        <class name="HeadQuarter">
            <map-to xml="HQ"></map-to>
            <field name="name" type="string">
                <bind-xml name="Name" node="attribute" />
            </field>
            <field name="size" type="integer">
                <bind-xml name="Size" node="attribute" />
            </field>
            <field name="rooms" type="string" collection="arraylist">
                <bind-xml name="Rooms" node="element"></bind-xml>
            </field>
            <field name="floors" type="string" collection="vector">
                <bind-xml name="Floors" node="element"></bind-xml>
            </field>
            <field name="dob" type="date">
                <bind-xml name="building-date" node="element"></bind-xml>
            </field>
            <field name="branchName" type="string">
                <bind-xml name="branch_name" node="attribute"></bind-xml>
            </field>
            <field name="numberOfWorkers" type="integer">
                <bind-xml name="number_of_workers" node="element"></bind-xml>
            </field>
            <field name="map" collection="map"> <!-- Birinci map java kısmındaki HashMap objesinin adı, ikincisi ise collection tipi(Yani bildiğimiz java.util.Hashmap'ın kısaltması) -->
                <bind-xml name="mappp" node="element">
                <class name="org.exolab.castor.mapping.MapItem"> <!-- içiçe sınıf -->
                    <field name="key" type="java.lang.String">  <!-- hashmap key'i -->
                        <bind-xml name="key"/>
                    </field>
                    <field name="value" type="Branch"/>  <!-- Hashmap'ta tutulan obje -->
                </class>
                </bind-xml>
            </field>
        </class>               
            <class name="Branch"> <!-- Branch sınıfı tanımlaması -->
                <map-to xml="Branch"></map-to>
                <field name="branchName" type="string">
                    <bind-xml name="branch_name" node="element"></bind-xml>
                </field>
                <field name="numberOfWorkers" type="integer">
                    <bind-xml name="number_of_workers" node="element"></bind-xml>
                </field>
            </class>
</mapping>


Kodları koymuyorum fakat aklınıza takılan herhangi birşey olursa sorabilirsiniz. Şimdilik bu kadar, kolay gelsin.

Castor ile Mapping Kullanarak XML Veri Dönüştürme

Merhabalar,

Çalışmalara Castor ile devam ediyorum. Dün mapping dosyası olmadan Castor ile nasıl XML verisini dönüştürebileceğimizi araştırmıştım. Bugün de mapping dosyası ile bu iş nasıl oluyor onu araştırdım ve güzel deneyimler elde ettim. Projede dünkünden farklı sınıflar kullanarak öğrenme seviyemi yükselmiş bulunuyorum :)

Sınıflardan biraz bahsetmek gerekirse, HeadQuarter ve Branch sınıflarında çeşitli değişkenler var, aşağıdaki kodda daha iyi görülebilir, ve bu sınıflar arasında "has a relationship" bağlantısı bulunmakta. Ayrıca main metodumuzun bulunduğu Main sınıfımız da her zamanki yerinde duruyor. Şimdi kodlara geçelim.


HeadQuarter.Java

import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;

public class HeadQuarter{
    private String name = "";
    private int size = 0;
    private ArrayList<String> rooms = new ArrayList<String>();
    private Vector<String> floors = new Vector<String>();
    private Date dob = new Date();
    private ArrayList<Branch> branch = new ArrayList<Branch>();

    public HeadQuarter(String name, int size, ArrayList<String> rooms,
            Vector<String> floors, Date dob, ArrayList<Branch> branch) {
        super();
        this.name = name;
        this.size = size;
        this.rooms = rooms;
        this.floors = floors;
        this.dob = dob;
        this.branch = branch;
    }
    public ArrayList<Branch> getBranch() {
        return branch;
    }
    public void setBranch(ArrayList<Branch> branch) {
        this.branch = branch;
    }
    public Date getDob() {
        return dob;
    }
    public void setDob(Date dob) {
        this.dob = dob;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public ArrayList<String> getRooms() {
        return rooms;
    }
    public void setRooms(ArrayList<String> rooms) {
        this.rooms = rooms;
    }
    public Vector<String> getFloors() {
        return floors;
    }
    public void setFloors(Vector<String> floors) {
        this.floors = floors;
    }
    public HeadQuarter(){}   
}
 

Branch.java

public class Branch {
    private String branchName = "";
    private int numberOfWorkers = 0;    

    public String getBranchName() {
        return branchName;
    }
    public void setBranchName(String branchName) {
        this.branchName = branchName;
    }
    public int getNumberOfWorkers() {
        return numberOfWorkers;
    }
    public void setNumberOfWorkers(int numberOfWorkers) {
        this.numberOfWorkers = numberOfWorkers;
    }
    public Branch(String branchName, int numberOfWorkers) {
        super();
        this.branchName = branchName;
        this.numberOfWorkers = numberOfWorkers;
    }
    public Branch(){}
}
 

mapping.xml

<?xml version="1.0"?>
<mapping>
        <class name="HeadQuarter">
            <map-to xml="HQ"></map-to>
            <field name="name" type="string">
                <bind-xml name="Name" node="attribute" />
            </field>
            <field name="size" type="integer">
                <bind-xml name="Size" node="attribute" />
            </field>
            <field name="rooms" type="string" collection="arraylist">
                <bind-xml name="Rooms" node="element"></bind-xml>
            </field>
            <field name="floors" type="string" collection="vector">
                <bind-xml name="Floors" node="element"></bind-xml>
            </field>
            <field name="dob" type="date">
                <bind-xml name="building-date" node="element"></bind-xml>
            </field>
            <field name="branch" type="Branch" collection="arraylist">
                <bind-xml name="Branches" node="element"></bind-xml>
            </field>
        </class>
            <class name="Branch">
                <map-to xml="Branches"></map-to>
                <field name="branchName" type="string">
                    <bind-xml name="branch_name" node="attribute"></bind-xml>
                </field>
                <field name="numberOfWorkers" type="integer">
                    <bind-xml name="number_of_workers" node="element"></bind-xml>
                </field>
            </class>
</mapping>


Main.Java

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.FieldHandler;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.loader.FieldHandlerImpl;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;

public class Main {
    /**
     * @param args
     * @throws IOException
     * @throws ValidationException
     * @throws MarshalException
     * @throws MappingException
     */
    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws IOException, MarshalException, ValidationException, MappingException {
        // TODO Auto-generated method stub
        ArrayList<String> rooms1 = new ArrayList<String>();
        rooms1.add("firstroom");
        rooms1.add("secondroom");
        rooms1.add("thirdroom");
        Vector<String> floors1 = new Vector<String>();
        floors1.add("firstfloor");
        floors1.add("secondfloor");
        Date dob = new Date(2011,12,22);
        ArrayList<Branch> branch = new ArrayList<Branch>();
        branch.add(new Branch("Umraniye", 500));
        branch.add(new Branch("Maslak", 275));
        HeadQuarter hq = new HeadQuarter("hq1",3,rooms1,floors1,dob,branch);
                
        // Marshalling Starts
        Mapping mapping = new Mapping();
        mapping.loadMapping("mapping.xml");
        XMLContext context =  new XMLContext();     
        context.addMapping(mapping);
        FileWriter writer = new FileWriter("output.xml");
        OutputFormat format = new OutputFormat();
        format.setIndenting(true);
        format.setIndent(4);
        XMLSerializer serializer = new XMLSerializer(writer, format);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setSuppressXSIType(true);
        marshaller.setWriter(writer);
        marshaller.setDocumentHandler(serializer.asDocumentHandler());
        marshaller.marshal(hq);
        // Marshalling ends
       
        // Unmarshalling Starts
        FileReader reader = new FileReader("output.xml");
        Unmarshaller unmarshaller =  context.createUnmarshaller();
        unmarshaller.setMapping(mapping);
        unmarshaller.setClass(HeadQuarter.class);
        HeadQuarter hq2 = (HeadQuarter) unmarshaller.unmarshal(reader);
        // Unmarshalling ends

}
}
 

Burada kafaları karıştıracak olan kısmın mapping.xml olacağını düşünüyorum. Bunun nasıl ve hangi kurallara göre yazılacağını Castorun sitesindeki dökümanı zaten çok güzel anlatıyor olduğu için bir daha yazmıyorum ancak yine de kafanıza takılan bir yer olursa yardımcı olmaya çalışırım elbette. Zaten projeyi çalıştırdıktan sonra alacağınız çıktıyı da inceleyerek neyi nerede ve ne için kullandığımı daha iyi anlayabilirsiniz. Ayrıca, bu projeyi çalıştırmak için gerekli olan jar dosyalarını bir kez daha aşağıya yazıyorum, bunlar olmadan çalışmıyor ne yazık ki :)

- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar


Şimdilik bu kadar. Esen kalın.,  

28 Temmuz 2011 Perşembe

Mapping Dosyası Olmadan Castor Unmarshalling Operasyonu

Arkadaşlar Merhaba,

Staj yaptığım yer olan Kartaca Bilişimde Castor frameworkunu incelemeye devam ediyorum halen. Bugün karşılaştığım ve çözmek için baya uğraştığım bir durumu yazacağım. Daha önceki yazımda Castor ile XML marshalling ve unmarshalling operasyonlarının nasıl yapıldığını yazmıştım. O yazıda bu işlemleri mapping.xml adında bir dosya ile gerçekleştiriyordum. Bu dosya, Castor'a XML i nasıl parçalayacağı hakkında bilgi veriyordu. Ancak bazen büyük projelerde mevcut dosyaların içine yeni bir tane XML dosyası eklemek istenilmeyen birşey olabiliyor. Böyle bir durum için, XML dosyası olmadan nasıl yapılabilir bu işler onu araştırdım.

Aslında parçalayacağımız XML dosyasında 1 tane kayıt varsa işimiz kolay, fakat burada 1den fazla kayıt olduğu durumlarda marshalling işleminde XMLe bilgileri kaydederken hiyerarşi icabı başına ekstra tag koyarak kaydediyor. Yani şunun gibi,


<anonymous-tag>
        <person>...</person>
        <person>...</person>
</anonymous-tag>

Bu durumda da bu XMLi unmarshal ederken problem çıkıyor. Bunu, person listemizi ayrı bir sınıfa koyarak çözüyoruz.Yazılanlar havada kalmış olabilir, o yüzden kodlara geçelim.

 Person.Java

import java.util.Date;

public class Person{
    private String name = null;
    private Date dob = null;
    public Person() {
        super();
    }
    public Person(String name) {
        this.setName(name);
    }
    public Person(String name, Date dob) {
        this.setName(name);
        this.setDob(dob);
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setDob(Date dob) {
        this.dob = dob;
    }
    public Date getDob() {
        return dob;
    }
    public String toString(){
        return "Name: "+this.getName()+"\nDate of Birth: "+this.getDob();
    }  
}


PersonList.Java


public class PersonList {

    public PersonList(int number) {
        super();
        this.person = new Person[number];
    }
    public PersonList() {
        super();
    }
    private Person[] person;
    public Person[] getPerson() {
        return person;
    }
    public void setPerson(Person[] person) {
        this.person = person;
    }
}


Main.Java

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;

public class Main {
    @SuppressWarnings("deprecation")
    public static void main(String[] args) throws IOException,
        MappingException, MarshalException, ValidationException {

        //
Yeni Person objesi
        Person person = new Person("Emre Gözen");
        person.setDob(new Date(1999, 06, 29, 12, 20));    
        // Yeni Person objesi
        Person person2 = new Person("Emre Gözen1234564");
        person2.setDob(new Date(1999, 06, 29, 12, 20));      
        PersonList personList = new PersonList(2);
        personList.getPerson()[0]=person;
        personList.getPerson()[1]=person2;       
       
        // Marshalling için Writer objesi
        FileWriter writer = new FileWriter("test.xml");
        XMLContext context =  new XMLContext();       
        // Marshaller objesi
        Marshaller marshaller = context.createMarshaller();
        marshaller.setWriter(writer);
        marshaller.setSuppressXSIType(true);
        // Marshalling işlemi
        marshaller.marshal(personList);
      
        // Unmarshalling için Reader
        FileReader reader = new FileReader("test.xml");       
        XMLContext context2 = new XMLContext();
        // Unmarshaller objesi
        Unmarshaller unmarshaller =
        context2.createUnmarshaller();
        unmarshaller.setClass(PersonList.class);       

        // Unmarshalling işlemi       
        PersonList personList2 = (PersonList) unmarshaller.unmarshal(reader);
       
        // Sonucu ekrana yazdırma
        for (int i = 0; i < 2; i++) {
            System.out.println(personList2.getPerson()[i].getName() + "\n\n");
        }      
    }   
}


Takıldığınız yer olursa beraber inceleyebiliriz. Şimdilik bu kadar.

Herkese iyi günler.