NHibernate 설정 및 HBM Mapping(1)

|

NHibernate Download : http://nhibernate.info/


기본 Layout

conf -> Oracle.cfg.xml : oracle DB 접속 정의

mapper -> HBM : xml을 이용한 mapping file

model -> HBM : xml과 mapping될 정의 Class

Repository : DB Query 및 DML, DCL 정의








대략 이런 형식의 구조를 갖고 내용정리를 진행 하겠다.


Oracle.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory>
    <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
    <property name="connection.connection_string">
      DB Connection String(ex: User ID=id;Password=pwdData Source=source)
    </property>
    <property name="show_sql">false</property>
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="DBRepository"/>
  </session-factory>
</hibernate-configuration>

xml은 빌드 작업을 리소스 포함으로 한다.



SessinManager Singleton patten

using NHibernate;
using NHibernate.Cfg;


public class SessionManager
 {
        static SessionManager m_currentInstance;
        static ISessionFactory m_sessionFactory;

        public static SessionManager currentInstance
        {
            get
            {
                if(m_currentInstance == null)
                {
                    object sync = new object();
                    lock(sync)
                    {
                        m_currentInstance = new SessionManager();
                    }
                }
                return m_currentInstance;
            }
        }
        public ISession session
        {
            get
            {
                if(m_sessionFactory == null)
                {
                    object sync = new object();
                    lock(sync)
                    {
                        m_sessionFactory = new Configuration().Configure(GetType().Assembly, "DBRepository.conf.Oracle.cfg.xml").BuildSessionFactory();
                    }
                }
                return m_sessionFactory.OpenSession();
            }
        }
        private SessionManager() { }

}

Configure시 리소스 포함으로 xml을 설정 했으므로 설정 xml 경로는 "DBRepository.conf.Oracle.cfg.xml"형태

"namespace.file명" 정도로 정의 가능 하겠다.


Repository pattern의 Interface 정의(제네릭을 사용한다)

public interface IRepository<T>
    {
        T Get(object id);
        void Save(T value);
        void Update(T value);
        void Delete(T value);
        IList<T> GetAll();
    } 


NHibernateRepository pattern 구현

public class NHibernateRepository<T> :IRepository<T> where T :class
    {
        protected readonly ISession session = SessionManager.currentInstance.session;
        public T Get(object id)
        {
            using (var transaction = session.BeginTransaction())
            {
                T returnVal = session.Get<T>(id);
                transaction.Commit();
                return returnVal;
            }
        }
        public void Save(T value)
        {
            using (var transaction = session.BeginTransaction())
            {
                session.Save(value);
                transaction.Commit();
            }
        }
        public void Update(T value)
        {
            using (var transaction = session.BeginTransaction())
            {
                session.Update(value);
                transaction.Commit();
            }
        }
        public void Delete(T value)
        {
            using (var transaction = session.BeginTransaction())
            {
                session.Delete(value);
                transaction.Commit();
            }
        }
        public IList<T> GetAll()
        {
            using (var transaction = session.BeginTransaction())
            {
                IList<T> returnVal = session.CreateCriteria<T>().List<T>();
                transaction.Commit();
                return returnVal;
            }
        }
    }

Repository Interface를 상속 받아 제네릭형식으로 구현한다. 제네릭 형식은 class형으로 제한한다.

위와 같이 정의하여 나머지 Data를 조회할 Repository Class는 NHibernateRepository를 상속받아 사용하기 때문에

메소드 구현부의 session open을 따로 하지 않아도 되겠다.

허나 Transaction이 있을 경우 Session의 Transaction을 가져와 Commit 또는 Rollback을 구현하는 형식으로 진행 한다.



And