-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 
Author Message
 Post subject: Master detail relationship
PostPosted: Tue Mar 17, 2009 3:30 pm 
Newbie

Joined: Fri Mar 13, 2009 3:32 pm
Posts: 4
Please,

That someone can give me a light, I am testing the NH, but I am not able to make this relationship.
I'm using SQL Server database sample AdventureWorksLT, and my classes and mapping files are below.
I tried several configurations with <bag> <list> ... but anything works!
The error when I run the Load in SalesOrder is:

NHibernate.Exceptions.GenericADOException was caught
Message="could not initialize a collection: [NHibernate3.Model.SalesOrder.Details#71782][SQL: SELECT details0_.SalesOrderId as SalesOrd1_1_, details0_.SalesOrderDetailID as SalesOrd2_1_, details0_.SalesOrderID as SalesOrd1_1_0_, details0_.SalesOrderDetailID as SalesOrd2_1_0_ FROM SalesLT.SalesOrderDetail details0_ WHERE details0_.SalesOrderId=?]"
Source="NHibernate"
StackTrace:
at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type)
at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object id, ISessionImplementor session)
at NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object key, ISessionImplementor session)
at NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent event)
at NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection collection, Boolean writing)
at NHibernate.Collection.AbstractPersistentCollection.ForceInitialization()
at NHibernate.Engine.StatefulPersistenceContext.InitializeNonLazyCollections()
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
at NHibernate.Impl.CriteriaImpl.List(IList results)
at NHibernate.Impl.CriteriaImpl.List[T]()
at NHibernate3.Model.SalesOrder.Load(Int32 salesOrderId) in C:\Documents and Settings\emmanuel\Meus documentos\Visual Studio 2008\Projects\NHibernate3\NHibernate3.Model\SalesOrder.cs:line 44
InnerException: System.InvalidCastException
Message="Specified cast is not valid."
Source="NHibernate3.Model"
StackTrace:
at (Object , Object[] , SetterCallback )
at NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues(Object target, Object[] values)
at NHibernate.Tuple.Component.PocoComponentTuplizer.SetPropertyValues(Object component, Object[] values)
at NHibernate.Type.ComponentType.SetPropertyValues(Object component, Object[] values, EntityMode entityMode)
at NHibernate.Type.ComponentType.ResolveIdentifier(Object value, ISessionImplementor session, Object owner)
at NHibernate.Type.ComponentType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
at NHibernate.Loader.Loader.GetKeyFromResultSet(Int32 i, ILoadable persister, Object id, IDataReader rs, ISessionImplementor session)
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type)
InnerException:

Files:

public class SalesOrder {
public virtual int SalesOrderId { get; set; }
public virtual IList Details { get; set; }
public virtual IList<SalesOrder> Load(int salesOrderId) {
var session = NHibernateHelper.OpenSession();
var criteria = session.CreateCriteria(typeof(SalesOrder));
criteria.Add(NHibernate.Criterion.Expression.Eq("SalesOrderId", salesOrderId));
IList<SalesOrder> salesOrders = null;
try {
salesOrders = criteria.List<SalesOrder>();
}
catch(Exception e) {
//session.Transaction.Rollback();
}
finally {
session.Close();
}
return salesOrders;
}
}

public class SalesOrderDetail {
public virtual int SalesOrderId { get; set; }
public virtual int SalesOrderDetailId { get; set; }

public override int GetHashCode() {
int result = this.SalesOrderId.GetHashCode();
result += this.SalesOrderDetailId.GetHashCode();
return result;
}
public override bool Equals(object obj) {
if(obj == null)
return false;
SalesOrderDetail soDetail = (SalesOrderDetail)obj;
return soDetail.SalesOrderId.Equals(this.SalesOrderId) && soDetail.SalesOrderDetailId.Equals(this.SalesOrderDetailId);
}
}

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate3.Model" assembly="NHibernate3.Model">
<class name="NHibernate3.Model.SalesOrder" table="SalesLT.SalesOrderHeader">
<id name="SalesOrderId" column="SalesOrderID" type="Int32" >
<generator class="identity" />
</id>
<bag name="Details" inverse="true" lazy="false" cascade="all">
<key>
<column name="SalesOrderId" />
</key>
<one-to-many class="NHibernate3.Model.SalesOrderDetail" />
</bag>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate3.Model" assembly="NHibernate3.Model">
<class name="NHibernate3.Model.SalesOrderDetail" table="SalesLT.SalesOrderDetail" lazy="false">
<composite-id>
<key-many-to-one name="SalesOrderId" column="SalesOrderID" class ="NHibernate3.Model.SalesOrder" />
<key-property name="SalesOrderDetailId" column="SalesOrderDetailID" type ="Int32" />
</composite-id>
</class>
</hibernate-mapping>


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 18, 2009 3:37 am 
Expert
Expert

Joined: Thu Dec 14, 2006 5:57 am
Posts: 1185
Location: Zurich, Switzerland
Is there an inner exception ? What does it say ? Your problem probably is the owning end of the association being part of a composite id:

Code:
<composite-id>
<key-many-to-one name="SalesOrderId" column="SalesOrderID" class ="NHibernate3.Model.SalesOrder" />
...
</composite-id>

_________________
--Wolfgang


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 18, 2009 1:07 pm 
Newbie

Joined: Fri Mar 13, 2009 3:32 pm
Posts: 4
I solved using

Code:
    <composite-id>
      <key-many-to-one name="SalesOrder" column="SalesOrderID" class="NHibernate3.Model.SalesOrder" />
      <key-property name="SalesOrderDetailId" column="SalesOrderDetailID" type ="integer" />
    </composite-id>


and

Code:
   public virtual SalesOrder SalesOrder { get; set; }


in SalesOrderDetail class.

But is confuse to me... what ever...

Thank's


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 19, 2009 3:11 am 
Expert
Expert

Joined: Thu Dec 14, 2006 5:57 am
Posts: 1185
Location: Zurich, Switzerland
Sorry, missed the problem with SalesOrder/SalesOrderId in the first:

Code:
<key-many-to-one name="SalesOrder" column="SalesOrderID" class="NHibernate3.Model.SalesOrder" />


A association in hibernate is always bassed on classes, not on ids. If you just want to put the id there, you have to use key-property.

Code:
public virtual SalesOrder SalesOrder { get; set; }


Since you marked the other end of the association as inverse, you need the owning end on SalesOrderDetail. Hibernate probably can't use the key-many-to-one for that.

Check this for parent-child mapping:

http://www.nhforge.org/doc/nh/en/index.html#example-parentchild

_________________
--Wolfgang


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 19, 2009 3:18 pm 
Newbie

Joined: Fri Mar 13, 2009 3:32 pm
Posts: 4
Hi, thanks very much.
Now I can read the data from database, but I can't insert!!!
The error message is:
{"Unexpected row count: 0; expected: 1"}
System.Exception {NHibernate.StaleStateException}

It is too complicated to work with NH, the documentation doesn't explain everything or all the mapping file configuration parameters, like Master-Detail mapping, composite keys.

I think I will give it up for now.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 20, 2009 2:58 am 
Expert
Expert

Joined: Thu Dec 14, 2006 5:57 am
Posts: 1185
Location: Zurich, Switzerland
Check out http://nhforge.org/Default.aspx and the reference documentation http://nhforge.org/doc/nh/en/index.html. And there is a book available "NHibernate in Action". Actually you can take every book about Hibernate (java version), too. The principles are the same.

_________________
--Wolfgang


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 20, 2009 8:43 am 
Newbie

Joined: Fri Mar 13, 2009 3:32 pm
Posts: 4
OK, thank you again.
I'll keep trying.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.