the matter is that you does not have a one-to-one relation.
On Thu, Jan 6, 2011 at 9:10 AM, David Schmitt <[email protected]> wrote:
> Hi everyone,
>
> I'm having troubles mapping two one-to-one relations and would like to
> check whether I'm doing the mapping wrong before filing a bug.
>
> My entities:
> public class Parent
> {
> public virtual int ID { get; set; }
> public virtual int ModuleId { get; set; }
> public virtual Child A { get; set; }
> public virtual Child B { get; set; }
> }
>
> public class Child
> {
> public virtual int ID { get; set; }
> public virtual Parent AParent { get; set; }
> public virtual Parent BParent { get; set; }
> }
>
> My tables:
> CREATE TABLE public.child
> (
> id serial NOT NULL,
> CONSTRAINT pk_child PRIMARY KEY (id)
> )
>
> CREATE TABLE public.parent
> (
> id serial NOT NULL,
> moduleid integer NOT NULL,
> a integer,
> b integer,
> CONSTRAINT pk_parent PRIMARY KEY (id),
> CONSTRAINT fk_a FOREIGN KEY (a)
> REFERENCES public.child (id),
> CONSTRAINT fk_b FOREIGN KEY (b)
> REFERENCES public.child (id)
> )
>
> My mapping, according to section 5.1.11. one-to-one, "unique foreign key
> associations":
> <class name="Parent">
> <id name="ID">
> <generator class="native"/>
> </id>
> <property name="ModuleId" />
> <many-to-one name="A"
> class="Child" />
> <many-to-one name="B"
> class="Child" />
> </class>
>
> <class name="Child">
> <id name="ID">
> <generator class="native"/>
> </id>
>
> <one-to-one name="AParent"
> class="Parent"
> constrained="false"
> property-ref="A" />
> <one-to-one name="BParent"
> class="Parent"
> constrained="false"
> property-ref="B" />
> </class>
>
> My query:
> List<Child> childs = session
> .Query<Child>()
> .Where(i => (i.AParent != null && i.AParent.ModuleId == 10)
> || (i.BParent != null && i.BParent.ModuleId == 10))
> .ToList();
>
> That is, select all Childs whose parent has a ModuleId == 10 or no
> parent at all.
>
> The problem now is, that this is translated into wrong SQL:
>
> select child0_.ID as ID1_
> from Child child0_, Parent parent1_, Parent parent2_
> where
> child0_.ID=parent1_.A
> and child0_.ID=parent2_.B
> and (
> (child0_.ID is not null) and parent1_.ModuleId=:p0
> or (child0_.ID is not null) and parent2_.ModuleId=:p1);
> :p0 = 10 [Type: Int32 (0)], :p1 = 10 [Type: Int32 (0)]
>
> A similar query is created using this HQL:
> from Child c
> where c.AParent.ModuleId = 10 or c.BParent.ModuleId = 10
>
> Here's the query I'd expect:
>
> select child0_.ID as ID1_
> from Child child0_
> left join Parent parent1_ on (child0_.ID=parent1_.A)
> left join Parent parent2_ on (child0_.ID=parent2_.B)
> where
> (parent1_.A is not null) and parent1_.ModuleId=10
> or (parent2_.B is not null) and parent2_.ModuleId=10
>
>
>
> What have I done wrong? Or, is this an NHibernate bug?
>
>
>
> Best Regards, David
>
> --
> dasz.at OG Tel: +43 (0)664 2602670 Web: http://dasz.at
> Klosterneuburg UID: ATU64260999
>
> FB-Nr.: FN 309285 g FB-Gericht: LG Korneuburg
>
> --
> 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]<nhusers%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/nhusers?hl=en.
>
>
--
Fabio Maulo
--
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.