Seam – Hibernate Entegrasyonu

Seam-Hibernate Entegrasyonu

Seam-Hibernate Entegrasyonu

Seam ile oluşturduğumuz projelerde Seam-gen deki templerlerden dolayı default olarak JPA ve üzerine Hibernate provider geliyor. Ancak başka bir alternatif projemize olarak core Hibernate desteğide sağlayabiliriz. Bu durumda artık JPA nın EntityManager değil Hibernate Session nesneleri ile çalışmamız gerekiyor. Aşağıda bununla ilgili bir örnek bulunmakta.

Öncelikle bir Seam projesi oluşturuyoruz ben projenin ismini seamHibernate olarak verdim. Proje direkt JPA desteği ile birlikte geldiğinden src/main/META-INF/ altındaki persistence.xml dosyasını silebiliriz. Bunun yerine src/main/ altında hibernate.cfg.xml dosyası oluşturuyoruz. Bu dosyanın içeriği aşağıdaki gibi olabilir.

    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
    <hibernate-configuration>
        <session-factory name="java:/seamHibernate">
            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <property name="connection.datasource">java:/seamHibernateDatasource</property>
            <property name="hbm2ddl.auto">update</property>
            <property name="cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
            <property name="transaction.flush_before_completion">true</property>
            <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
           
            <mapping class="org.domain.seamhibernate.entity.Ogrenci"/>
            <mapping class="org.domain.seamhibernate.entity.DersNotu"/>
        </session-factory>
    </hibernate-configuration>

JBoss için datasource un bulunduğu seamHibernate-ds.xml dosyasını aynen bırakabilirsiniz. Aynı datasource üzerinden bağlanıyor olacağız.

Şimdi components.xml dosyasını açıyoruz. Bendeki konfigurasyon aşağıdaki gibi. Burada dikkat etmeniz gereken Seam context i dahilindeki persistence tanımları Hibernate olarak konfigure etmiş olmamızdır. İsim olarak Seam Application FrameworkhibernateSession” ismini kullanıyor bende bu şekilde bıraktım.

    <?xml version="1.0" encoding="UTF-8"?>
    <components xmlns="http://jboss.com/products/seam/components"
     xmlns:core="http://jboss.com/products/seam/core" xmlns:persistence="http://jboss.com/products/seam/persistence"
     xmlns:drools="http://jboss.com/products/seam/drools" xmlns:bpm="http://jboss.com/products/seam/bpm"
     xmlns:security="http://jboss.com/products/seam/security" xmlns:mail="http://jboss.com/products/seam/mail"
     xmlns:web="http://jboss.com/products/seam/web" xmlns:ui="http://jboss.com/products/seam/ui"
     xmlns:transaction="http://jboss.com/products/seam/transaction"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd
                 http://jboss.com/products/seam/ui http://jboss.com/products/seam/ui-2.2.xsd
                    http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.2.xsd
                    http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.2.xsd
                    http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.2.xsd
                    http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd
                    http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.2.xsd
                    http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.2.xsd
                    http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.2.xsd
                    http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd">
     
     <core:init debug="true" jndi-pattern="@jndiPattern@" />
     
     <core:manager concurrent-request-timeout="500"
      conversation-timeout="120000" conversation-id-parameter="cid"
      parent-conversation-id-parameter="pid" />
     
     <!– Make sure this URL pattern is the same as that used by the Faces Servlet –>
     <web:hot-deploy-filter url-pattern="*.seam" />
     
     <persistence:hibernate-session-factory name="hibernateSessionFactory" />
     
     <persistence:managed-hibernate-session name="hibernateSession" session-factory="#{hibernateSessionFactory}"
      auto-create="true" />
     
     <ui:hibernate-entity-loader session="#{hibernateSession}" />
     
     <security:identity authenticate-method="#{authenticator.authenticate}"
      remember-me="true" />
     
     <event type="org.jboss.seam.security.notLoggedIn">
      <action execute="#{redirect.captureCurrentView}" />
     </event>
     <event type="org.jboss.seam.security.loginSuccessful">
      <action execute="#{redirect.returnToCapturedView}" />
     </event>
     
     <mail:mail-session host="localhost" port="25" />
     
     <!– For use with jBPM pageflow or process management –>
     <!– <bpm:jbpm>
    <bpm:process-definitions></bpm:process-definitions> <bpm:pageflow-definitions></bpm:pageflow-definitions>
      </bpm:jbpm> –>
     
    </components>

Şimdi Seam içerisinde bir entity oluşturdugumuzda alışageldiğiniz yapıda EntityHome ve EntityList sınıflarını miras alan dao sınıfları oluşturur bu sınıflar için aslında birer Hibernate karşılığı bulunuyor. Bu yapı Seam Application Framework içerisinde yer almakta ve iki konfigurasyonla birlikte gelmekte. Biz bunu Hibernate e göre kullanacagız.

Şimdi Eclipse te File -> New -> Seam Enitiy deyip Ogrenci adında bir entity oluşturalım. Burada bizim için OgrenciHome.java ve OgrenciList.java sınıflarınıda oluşturacaktır. Bu sınıflar normalde EntityHome ve EntityQuery sınıflarını miras almaktadır. Bunlar bize JPA için CRUD operasyonlarını getirecektir. Ancak bizim Hibernate versiyonlarını kullanmamız gerekiyor. Bun sınıflar ise HibernateEntityHome ve HibernateEntityQuery sınıflarıdır. Yine benzer bir şekilde hibernate için HibernateEntityController sınıfıda yer almaktadır.

OgrenciHome ve OgrenciList i buna göre düzenliyoruz.

OgrenciHome.java

    package com.mergecons.seamhibernate.session;
     
    import org.jboss.seam.annotations.Begin;
    import org.jboss.seam.annotations.Name;
    import org.jboss.seam.annotations.web.RequestParameter;
    import org.jboss.seam.framework.HibernateEntityHome;
     
    import com.mergecons.seamhibernate.entity.Ogrenci;
     
    @Name("ogrenciHome")
    public class OgrenciHome extends HibernateEntityHome<Ogrenci>
    {
        @RequestParameter Long ogrenciId;
     
        @Override
        public Object getId()
        {
            if (ogrenciId == null)
            {
                return super.getId();
            }
            else
            {
                return ogrenciId;
            }
        }
     
        @Override @Begin
        public void create() {
            super.create();
        }
     
    }

OgrenciList.java

    package com.mergecons.seamhibernate.session;
     
    import org.jboss.seam.annotations.Name;
    import org.jboss.seam.framework.HibernateEntityQuery;
     
    import com.mergecons.seamhibernate.entity.Ogrenci;
     
    @Name("ogrenciList")
    public class OgrenciList extends HibernateEntityQuery<Ogrenci>
    {
        public OgrenciList()
        {
            setEjbql("select ogrenci from Ogrenci ogrenci");
        }
    }

Peki artık uygulamaızı publish edelim ve ne yapacağını görelim.

Bende aşağıdaki gibi bir hata verdi ?

Caused by: java.lang.NoSuchMethodError: org.hibernate.cfg.AnnotationConfiguration.setProperty(Ljava/lang/String;Ljava/lang/String;)Lorg/hibernate/cfg/AnnotationConfiguration;

Bu hatanın sebebi ilgili Hibernate ile ilgili bazı jar ları bulamaması. Uygulama sunucusu olarak JBoss kullandığımdan persistence ile ilgili jarların bir kısmını container içerisinde bulunduruyor. Container içerisindeki jar lara aşağıdakileri de eklememiz gerekebilir. Bu jar ları Seam Runtime içerisindeki lib klasörü altında bulabilirsiniz.

lucene-core.jar
slf4j-api.jar
slf4j-log4j12.jar
hibernate-all.jar

Umarım faydalı bir makale olmuştur.

Aug 2nd, 2011
No comments yet.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>