I think I have proved that this is a composite id issue.
I changed the 'Role' code above from:
<class name="Role" table="UserRoles">
<composite-id>
<key-many-to-one name="AssignedTo" class="User" column="UserID" />
<key-many-to-one name="Type" class="RoleType" column="RoleID" />
</composite-id>
<discriminator column="RoleID" insert="false" />
<subclass name="Mentor" discriminator-value="1" />
<subclass name="Teacher" discriminator-value="2" />
</class>
To:
<class name="Role" table="UserRoles">
<id name="Id" column="RoleID">
<generator class="native" />
</id>
<discriminator column="RoleID" insert="false" />
<many-to-one name="AssignedTo" class="User" column="UserID" />
<subclass name="Mentor" discriminator-value="1" />
<subclass name="Teacher" discriminator-value="2" />
</class>
Although this is a wrong mapping for my domain, but this worked
beautifully. The subclass was created using discriminator column.
Does anyone has any idea why the Table-per-class hierarchy does not
work with composite-id Classes?
Thanks,
Rohit
On May 5, 1:22 pm, Rohit <[email protected]> wrote:
> Thanks to Anne and Jason for your help. I have tried a few more things
> -
>
> 1) To test that if this really was a discriminator problem, I tried to
> reproduce this error with another hierarchy in my application. I
> changed the discriminator column to point to a column which I knew had
> bad data. The error I got in that case was:
>
> NHibernate.WrongClassException : Object with id: 41 was not of
> the specified subclass: ProductType (Discriminator was: '1')
>
> So, this shows that if NHibernate cannot match the discriminator to an
> existing discriminator value, then will throw this error.
>
> 2) I ran the log4net logging, and it generated the sql query
> perfectly, and binded the correct return values to the correct
> columns. Here's the sql query -
>
> SELECT this_.UserID as UserID15_0_,
> this_.RoleID as RoleID15_0_
> FROM UserRoles this_
> WHERE this_.UserID = 979488
>
> I saw that the RoleID (which is the discriminator) came back as '1',
> which is correct.
>
> 3) I also tried applying the abstract attribute to the Role class.
>
> <class name="Role" table="UserRoles" abstract="true">
>
> This did not help, and I get the same error.
>
> I have tried so many things, read the documentation, searched forums.
> But I am ready to try more suggestions that anyone can suggest.
>
> Again, thanks everybody.
> - Rohit
>
> On May 5, 12:35 pm, Jason Meckley <[email protected]> wrote:
>
> > isn't there an attribute you apply to the Role class mapping to let NH
> > know Role is abstract?
>
> > On May 5, 3:06 pm, Anne Epstein <[email protected]> wrote:
>
> > > Hi Rohit,
> > > I still don't think it's likely to be the composite ID:
>
> > > I ran a quick search on that message in the NHibernate codebase, and
> > > the one place that error is generated is in PocoInstantiator.cs:
> > > public object Instantiate()
> > > {
> > > if (ReflectHelper.IsAbstractClass(mappedClass))
> > > {
> > > throw new InstantiationException("Cannot
> > > instantiate abstract
> > > class or interface: ", mappedClass);
> > > }
> > > .... <more code here>
>
> > > The IsAbstractClass method in ReflectorHelper is simply this:
> > > public static bool IsAbstractClass(System.Type type)
> > > {
> > > return (type.IsAbstract || type.IsInterface);
> > > }
>
> > > It's pretty straightforward- it *really* looks like if you're getting
> > > that error, it's because it's trying to instantiate an abstract
> > > class/interface. My best guess is still a discriminator problem,
> > > maybe even something less-obvious like your id col is a string and
> > > it's got a space in it.
>
> > > If you don't have log4net logging turned on yet, you might give that a
> > > go-the sql you're generating might give you some ideas.
>
> > > Good luck!
>
> > > On Tue, May 5, 2009 at 1:22 PM, Rohit <[email protected]> wrote:
>
> > > > Thanks Anne for your response.
>
> > > > 1) There is no bad data in the discriminator column. I am running this
> > > > over a test database, and I have only 1 row in the UserRoles table.
>
> > > > 2) I tried with an interface. But same error. I don't think its the
> > > > abstract class causing this issue. The error message says -
> > > > "Cannot instantiate abstract class or interface".
>
> > > > Could it be the composite id?
>
> > > > <composite-id>
> > > > <key-many-to-one name="AssignedTo" class="User" column="UserID" />
> > > > <key-many-to-one name="Type" class="RoleType" column="RoleID" />
> > > > </composite-id>
>
> > > > Thanks,
> > > > Rohit
>
> > > > On May 4, 8:55 pm, Anne Epstein <[email protected]> wrote:
> > > >> Hi Rohit, welcome to the group! Looking at your issue, the error
> > > >> message is about an abstract class, so my guess you're having problems
> > > >> because it's trying to work with Roles directly.
>
> > > >> Thinking about this a little more, here's a thought: what will happen
> > > >> if you have some bad data in your discriminator column-say, null, or
> > > >> something other than 1 or 2. It'll try to create a concrete Role class
> > > >> instead of your subclasses. That would certainly generate your error,
> > > >> or something very similar.
>
> > > >> Alternatively, you may have better luck if you instead used an
> > > >> interface, as illustrated
> > > >> here:http://www.nhforge.org/doc/nh/en/index.html#inheritance-tableperclass
> > > >> if you're still having problems, it's worth a try...even if the
> > > >> classes inherit from a class behind the scenes, I think it's safer to
> > > >> work with an interface they share.
>
> > > >> On Mon, May 4, 2009 at 6:36 PM, Rohit <[email protected]> wrote:
>
> > > >> > Hi,
>
> > > >> > I am using NHibernate version 2.0.1.
>
> > > >> > I have an User class which has a collection of 'Role'. Role is an
> > > >> > abstract class from which 2 concrete classes derive - 'Mentor' and
> > > >> > 'Teacher'.
>
> > > >> > _______ ___________
> > > >> > | | | |
> > > >> > | User | ------------------>| Role |
> > > >> > |______| | __________|
> > > >> > ^
> > > >> > |
> > > >> > ________ |__________________
> > > >> > _______ |___ _________ |__________
> > > >> > | |
> > > >> > | |
> > > >> > | Mentor | |
> > > >> > Teacher |
> > > >> > |___________| |____________________|
>
> > > >> > The User mapping is as follows:
>
> > > >> > <class name="User" table="User">
> > > >> > <id name="Id" column="UserID">
> > > >> > <generator class="native" />
> > > >> > </id>
> > > >> > <set name="Roles">
> > > >> > <key column="UserID" />
> > > >> > <one-to-many class="Role" />
> > > >> > </set>
> > > >> > </class>
>
> > > >> > And the Role mapping is as:
>
> > > >> > <class name="Role" table="UserRoles">
> > > >> > <composite-id>
> > > >> > <key-many-to-one name="AssignedTo" class="User" column="UserID"
> > > >> > /
>
> > > >> > <key-many-to-one name="Type" class="RoleType" column="RoleID" />
> > > >> > </composite-id>
>
> > > >> > <discriminator column="RoleID" insert="false" />
>
> > > >> > <subclass name="Mentor" discriminator-value="1" />
> > > >> > <subclass name="Teacher" discriminator-value="2" />
> > > >> > </class>
>
> > > >> > As we can see, Role has a composite id, which is a mapping to the
> > > >> > User
> > > >> > class and a RoleType class.
>
> > > >> > When I try to retrieve a role for a user, I am getting the following
> > > >> > error:
> > > >> > NHibernate.InstantiationException : Cannot instantiate abstract class
> > > >> > or interface:Role
>
> > > >> > The subclass has always worked for me with other objects. Only here,
> > > >> > when using a composite-id, I am getting this error.
>
> > > >> > Can somebody help me please? This is the first time I am posting on
> > > >> > this forum. So if there is any additional information I can provide,
> > > >> > please let me know.
>
> > > >> > Many Thanks,
> > > >> > Rohit
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---