2009-11-08 3 views
1

내가 상속해야하는 기본 클래스가있는 핵심 어셈블리가있는 응용 프로그램이 있습니다.이 요소를 데이터베이스에 저장해야하고 NHibernate에 대한 정보를 읽은 후에 사용하기로 결정했습니다.NHibernate Joined-Subclass 문제의 하위 클래스

그러나 새로운 상속 된 클래스 중 하나에 문제가 있습니다. 하위 클래스 맵을 설정했지만 저장할 때 기본 클래스 속성이나 새 클래스 중 하나를 저장하려고 시도하지 않았습니다. 매핑에서!

내 클래스처럼 배치되어 다음

핵심 어셈블리 (작은 데모 애플리케이션에서) 있는 DataItem -> 사용자가 ID를 처리로 데이터베이스가있는 DataItem 클래스를 상속 만질

아무것도 , 수정 날짜 등 등 만 가지고 FIRSTNAME에 내 테스트 I 설정 사용자에

.. 나는 그것이 잘 작동 새로운 사용자를 .. 저장하면

내가 사용자로부터 상속 한 다음 다른 홍보를 추가하지만 이 새로운 개체를 저장하려고 시도합니다. INSERT INTO t_User (id) VALUES (?) 함께 SQL 문을 넣습니다. 첫 번째 이름이나 성을 저장하려고 시도하지 않습니다. 설정되어 매핑되었습니다.

내 nhibernate.config :

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory name="DAL"> 
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> 
    <property name="adonet.batch_size">16</property> 
    <property name="current_session_context_class">web</property> 
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 
    <mapping assembly="DAL"/> 
    <mapping assembly="NHibernateDemo"/> 
    </session-factory> 
</hibernate-configuration> 

당신은 내가 2 어셈블리를 볼 수 있듯이 .. 내 DAL 내 핵심이며, NHibernateDemo 상속의 코어를 사용하는 웹 응용 프로그램입니다.

내 핵심있는 DataItem 매핑 :

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DAL" namespace="DAL.Model"> 
    <class name="DataItem" table="t_DataItem" > 
    <id name="Id"> 
     <generator class="native" /> 
    </id> 
    <discriminator column="typeid" type="System.Int32"></discriminator> 
    <property name="IsActive" column="isActive" not-null="true" /> 
    <property name="TypeId" column="typeId" not-null="true"></property> 
    <many-to-one name="Parent" column="ParentId" class="DataItem"></many-to-one> 
    <bag name="Children" cascade="all-delete-orphan"> 
     <key column="ParentId"></key> 
     <one-to-many class="DataItem"/> 
    </bag> 
    <joined-subclass name="User" table="t_Users"> 
     <key column="id"></key> 
     <property name="FirstName" column="firstName" not-null="true" ></property> 
    </joined-subclass> 
    <joined-subclass name="Email" table="t_Emails"> 
     <key column="emailid"></key> 
     <property name="Address" column="Address"></property> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

내 상속 NEWUSER 매핑

이 작동하지 않습니다! :

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemo" namespace="NHibernateDemo.Model"> 
    <subclass name="NewUser" extends="DAL.Model.User, DAL" discriminator-value="1"> 
    <property name="LastName" column="LastName"></property> 
    </subclass> 

왜이다 나는 그것이 '아무튼 나의 클래스 NEWUSER을 저장하려고 할 때 기본 또는 새롭게 선언 된 프로퍼티로부터 다른 프로퍼티 세트를 저장하려고 시도하지 않습니까?

정말로 도움이되었거나 통찰력이있어 주셔서 감사합니다. 저는 정말 간단한 것을 놓치고 있어야합니다. 나는 그것을 볼 수 없습니다.

감사합니다,

마이크

답변

1

그것은 당신이 같은 클래스 계층 구조에서 하위 클래스와 조인 서브 클래스 매핑을 혼합 할 수없는 것을 할 수 있습니다. DataItem과 User가 joined-subclass로 관련되어 있으므로 NewUser 클래스를 User의 다른 조인 하위 클래스로 만들어야 할 수 있습니다.

또 다른 문제는 현재 NewUser 매핑에서 "discriminator"를 사용하는 것일 수 있습니다. discriminator는 NHibernate가 User 레코드와 NewUser 레코드의 차이를 알리기 위해 사용하는 사용자 테이블의 추가 열이어야합니다. 나는 NewUser가하는 반면 User Base 클래스가 discriminator 값을 지정하지 않을 수있는 곳에서 작동하는지 확신 할 수 없다. discriminator-column을 어느 위치에 지정했는지는 확실하지 않지만 문제가 될 수도 있습니다.

먼저 NewUser를 User의 가입 하위 클래스로 만들 것을 제안합니다.

+0

어쩌면 나는 '합류'라는 단어의 사용을 오해하고 있습니다. 그것은 select 쿼리를 수행하는 동안 조인을 시도한다는 것을 나타내지는 않습니까? 내 newuser 클래스는 데이터를 사용자 클래스와 동일한 테이블에 저장합니다. 유형 ID가 있지만 데이터 항목에 속합니다. 문제가 될 수 있습니다. 나는 당신이 제안한 것을 시도 할 것입니다 !!! 방향에 대한 감사. – mike

+0

Ok .. 그냥 내 NewUser 매핑을 사용자의 조인 하위 클래스로 전환하려고 시도했지만 여전히 다음과 같은 "INSERT INTO t_Users (ID) VALUES (?) .."와 함께 내 사용자 테이블에 저장하려고 시도합니다. firstname 또는 lastname 속성을 저장합니다. – mike