Discussion:
[nhusers] Mapping of child property to parent column
f***@smartliberty.ch
2018-05-14 15:39:13 UTC
Permalink
Hi,
I'm facing a problem that I can't make it work. I'm aware that it is a
special case, but it could be very useful with my use of interface

I have the following classes:

- Class *A*
- Class *A1* extends *A*
- Class *A2* extends *A* implement *IM*
- Class *B* implement *IM*
- Class *C*
- Interface *IM*
- Property of Class *C C_prop*

And the following tables:

- Table *A*
- column *C_id*
- Table *A1*
- Table *A2*
- Table *B*
- Column *C_id*
- Table *C*

For the Class *A2* I want to map the property of Class *C* to column *C_id*
of *A*. So I want to map the child property C to the parent column of A.
In the nhibernate documentation I found this in chapter 5.1.14 *"The
<component> element maps properties of a child object to columns of the
table of a parent class." *
So it seems to do exactly what I want to achieve.

So in mapping of Class* A* I have:

<component name="*C_prop*" class="*A2*">
<many-to-one name="*C_prop*" class="*C*" column="*C_id*"
unique="true"/>
</component>

I have the following error:
"Could not find a getter for property '*C_prop*' in class '*A*'"

What do I do wrong?
Thanks for your help.
--
You received this message because you are subscribed to the Google Groups "nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nhusers+***@googlegroups.com.
To post to this group, send email to ***@googlegroups.com.
Visit this group at https://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.
f***@smartliberty.ch
2018-05-15 13:25:10 UTC
Permalink
So I played a bit with a test project and I finally decided to add a column
to every sub-table of *A* of corresponding subclass which implement* IM*.
It's a bit annoying but I couldn't find a better way to make it work.


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


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ComponentNhibernateTest.Model"
namespace="ComponentNhibernateTest.Model"
<class name="A" table="a" >
<cache usage="read-write"/>
<id name="Id" type="Int64">
<generator class="native" />
</id>
<property name="Name" />


<joined-subclass name="A1" table="a1" >
<key column="Id" />
<property name="Foo" />
</joined-subclass>

<joined-subclass name="A2" table="a2" >
<key column="Id" />
<property name="Bar" />
<many-to-one name="C_Prop" class="C" column="cid" unique="true"
cascade ="all"/>
</joined-subclass>
</class>




<class name="B" table="b" >
<cache usage="read-write"/>
<id name="Id" type="Int64">
<generator class="native" />
</id>
<property name="Battr" />
<many-to-one name="C_Prop" class="C" column="cid" unique="true" cascade
="all"/>
</class>

<class name="C" table="c" >
<cache usage="read-write"/>
<id name="Id" type="Int64">
<generator class="native" />
</id>
<property name="Detail" />
<property name="OtherDetail" />
</class>



</hibernate-mapping>

My unittest:
A1 a1 = new A1
{
Name = "objectA1",
Foo = "foo"
};
A2 a2 = new A2
{
Name = "objectA2",
Bar = "Bar",
C_Prop = new C()
{
Detail = "detail a2",
OtherDetail = "other detail a2"
}
};
B b = new B
{
Battr="battre",
C_Prop = new C()
{
Detail = "detail b",
OtherDetail = "other detail b"
}
};

using (ISession session = NHibernateHelper.CreateSession())
using (ITransaction tx = session.BeginTransaction())
{
session.Save(a1);
session.Save(a2);
session.Save(b);
tx.Commit();
}
using (ISession session = NHibernateHelper.CreateSession())
{
a1 = session.Query<A1>().FirstOrDefault();
a2 = session.Query<A2>().FirstOrDefault();
b = session.Query<B>().FirstOrDefault();
}


Assert.IsNotNull(a1);
Assert.AreEqual(1, a1.Id);
Assert.IsNotNull(a2);
Assert.AreEqual(2, a2.Id);
Assert.IsNotNull(a2.C_Prop);
Assert.AreEqual(1, a2.C_Prop.Id);
Assert.IsNotNull(b);
Assert.AreEqual(1, b.Id);
Assert.IsNotNull(b.C_Prop);
Assert.AreEqual(2, b.C_Prop.Id);

Database structure:
CREATE TABLE c
(
id bigserial NOT NULL,
detail character varying,
otherdetail character varying,
CONSTRAINT c_pkey PRIMARY KEY (id)
)
WITH ( OIDS=FALSE );
ALTER TABLE c OWNER TO postgres;

CREATE TABLE a
(
id bigserial NOT NULL,
name character varying,
CONSTRAINT a_pkey PRIMARY KEY (id)
)
WITH ( OIDS=FALSE );
ALTER TABLE a OWNER TO postgres;
CREATE TABLE a1
(
id bigint NOT NULL,
foo character varying,
CONSTRAINT a1_pkey PRIMARY KEY (id),
CONSTRAINT a1_a_fkey FOREIGN KEY (id)
REFERENCES a (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH ( OIDS=FALSE );
ALTER TABLE a1 OWNER TO postgres;

CREATE TABLE a2
(
id bigint NOT NULL,
cid bigint,
bar character varying,
CONSTRAINT a2_pkey PRIMARY KEY (id),
CONSTRAINT a2_a_fkey FOREIGN KEY (id)
REFERENCES a (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT a2_c_fkey FOREIGN KEY (cid)
REFERENCES c (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH ( OIDS=FALSE );
ALTER TABLE a2 OWNER TO postgres;

CREATE TABLE b
(
id bigserial NOT NULL,
battr character varying,
cid bigint,
CONSTRAINT b_pkey PRIMARY KEY (id),
CONSTRAINT b_c_fkey FOREIGN KEY (cid)
REFERENCES c (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH ( OIDS=FALSE );
ALTER TABLE b OWNER TO postgres;

I'll be fine with this, but if someone find a solution of my first post, I
would be happy to know it.
Post by f***@smartliberty.ch
Hi,
I'm facing a problem that I can't make it work. I'm aware that it is a
special case, but it could be very useful with my use of interface
- Class *A*
- Class *A1* extends *A*
- Class *A2* extends *A* implement *IM*
- Class *B* implement *IM*
- Class *C*
- Interface *IM*
- Property of Class *C C_prop*
- Table *A*
- column *C_id*
- Table *A1*
- Table *A2*
- Table *B*
- Column *C_id*
- Table *C*
For the Class *A2* I want to map the property of Class *C* to column
*C_id* of *A*. So I want to map the child property C to the parent column
of A.
In the nhibernate documentation I found this in chapter 5.1.14 *"The
<component> element maps properties of a child object to columns of the
table of a parent class." *
So it seems to do exactly what I want to achieve.
<component name="*C_prop*" class="*A2*">
<many-to-one name="*C_prop*" class="*C*" column="*C_id*"
unique="true"/>
</component>
"Could not find a getter for property '*C_prop*' in class '*A*'"
What do I do wrong?
Thanks for your help.
--
You received this message because you are subscribed to the Google Groups "nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nhusers+***@googlegroups.com.
To post to this group, send email to ***@googlegroups.com.
Visit this group at https://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.
Loading...