개발 이야기/ORM2012. 4. 15. 12:37

NHibernate 실전 – Object Relational Mapping

벌써 18번째 세션을 진행하게 되었습니다. Entity Framework 4.0에서 MyBatis.Net 그리고 NHibernate까지 보통 ORM 프레임워크라고 불리는 것들에 대해서 살펴보았는데요이번에 알아볼 내용은 ORM!! NHibernate에서 말하는 Object Relational Mapping에 대해서 알아보겠습니다.

 

실전프로젝트 기본 구성

이번 세션부터 기본적인 사항들을 확인해서 실전으로 CRUD까지 작업을 해보겠습니다. MVC Razor 웹 프로젝트를 하나 생성해주세요. Entity Framework를 되새기면서 해주시면 됩니다.

18_01.JPG

[그림 18-1] 웹 프로젝트 추가

 

MVC 웹 프로젝트를 다음과 같이 구성하려합니다미리 참고해주세요.

18_02.JPG

[그림 18-2] 프로젝트 구성도

 

Web.config에 Database Connection 정보를 입력해주세요.

 

  <configSections>

    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>

  </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

    <session-factory name="NHibernateDemo">

      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

      <property name="connection.connection_string">

        Data Source=JISEON-PC\JISEON2;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=P@ssw0rd;

      </property>

      <property name="adonet.batch_size">10</property>

      <property name="show_sql">true</property>

      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>

      <property name="use_outer_join">true</property>

      <property name="command_timeout">60</property>

      <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

      <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

    </session-factory>

  </hibernate-configuration>

 

 

NHibernate 관련 DLL을 참조해주세요. NHibernate에서 다운받은 폴더에 있습니다.

l  NHibernate.dll

l  Iesi.Collections.dll

l  NHibernate.ByteCode.LinFu.dll

l LinFu.DynamicProxy.dll 

 

 

DataTable Object

NHibernate는 데이터 테이블을 기준으로 객체를 매핑합니다매핑은 xml파일에서 정의가 되어지며 앞세션에서 말했듯이<table>.hbn.xml으로 생성됩니다백마디 말보다 한번 보여드리는게 더 와닿지요~

Northwind 데이터베이스 Shippers 테이블 스키마입니다.

18_03.JPG

[그림 18-3] Shippers 테이블 구조

 

테이블 구조에 맞게 Shippers 클래스를 구성해보겠습니다.

18_04.JPG

[그림 18-4] Shippers 테이블 구조

 

Shippers 클래스입니다.

 

    public class Shippers

    {

        private int _shipperID;

        private string _companyName;

        private string _phone;

 

        public Shippers()

        {

        }

 

        public virtual int ShipperID

        {

            get { return _shipperID; }

            set { _shipperID = value; }

        }

 

        public virtual string CompanyName

        {

            get { return _companyName; }

            set { _companyName = value; }

        }

 

        public virtual string Phone

        {

            get { return _phone; }

            set { _phone = value; }

        }

    }

 

 

Database의 테이블과 객체 매핑을 해주는 아래 정의된 xml파일입니다파일명은 테이블명을 앞에두고 뒤에 hbn.xml로 설정하면 됩니다“Shippers.hbm.xml”

 

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateDemo"assembly="NHibernateDemo">

 

  <class name="NHibernateDemo.Entities.Shippers" table="Shippers">

    <id name="ShipperID" column="ShipperID" type="Int32" unsaved-value="-1" access="field.camelcase-underscore">

      <generator class="identity" />

    </id>

    <property name="CompanyName" column="CompanyName" type="string" length="40" not-null="true"access="field.camelcase-underscore"/>

    <property name="Phone" column="Phone" type="string" length="24" access="field.camelcase-underscore"/>

 

  </class>

</hibernate-mapping>

 

 

 

Tip!

Visual Studio에 익숙한 여러분은 실제로 위에 xml파일들을 수동으로 설저아는게 결코 쉬운일은 아닐겁니다저 역시도 xml설정하는데 대소문자며 공백등으로 어려움이 있었고요 ㅋㅋㅋ NHibernate에서 다운받은 파일 중에 Required_Bins 폴더에 xsd 스키마 파일이 존재합니다.

 

Visual Studio 2010에서 XML 메뉴를 클릭합니다. Schemas.. 하위 메뉴를 클릭해서 위에서 봤던 스키마 파일을 추가하겠습니다.

18_05.JPG

[그림 18-5] XML 메뉴

 

2개 다 추가해주세요!

18_06.JPG

[그림 18-6] NHibernate에서 제공하는 스키마

 

로드된 xsd 파일을 인텔리센스에 적용합니다.

18_07.JPG 

[그림 18-7] XML Schemas

 

이제 xml 파일에서 문자를 입력하면 아래와 같이 인텔리센스 기능이 바로 사용됩니다. 후훗~

18_08.JPG 

[그림 18-8] XML Intellisense

 

이번 세션에서는 기본 프로젝트를 생성하고 Shippers 객체를 매핑해보았습니다다음 시간은 이 객체를 가져다 쓰는 방법에 대해서 알아보겠습니다끝까지 읽어주셔서 감사합니다.^^


sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/402604

Posted by 사나에