--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
- Bueno si mapeas a Party como Abstract = "True" no te genenera una tabla. Tambien podrias elegir mapear la herencia con <subclass...>.
- En el mapping del many to one te hace falta colocar el "class = "Party".
- Y el query que quieres hacer si es posible, quizas prueba "select o from Order o join fetch o.Customer c join fetch c.Party".
- Estas seguro que UNICAMENTE un cliente puede tener un party ? porque si no es asi debes quitar el "unique = true". El unique genera un constraint en la llave foranea de cliente -> party
Saludos,Nestor Andres Rodriguez
1. Si incluyes abstract=true en un mapeo <union-sub-class> no te va a generar tabla para la clase abstracta.
2. El incluir el abstract=true en un mapeo de <subclass> DEBES colocar la tabla en la definicion de la clase <class name=Party table=Parties> ya que esta estrategia persiste todo en una sola tabla.
3. Me surge la duda de si NHibernate te coloca automaticamente un <discriminator-column> y los <discriminator-values> cuando mapeas el <class> y las <subclass> respectivamente. Pensaria que deberias incluirlos.
4. Despues de esto verifica de nuevo el query.
Saludos
--
Bueno te comento,
Utilizando NH 3.0 hice el mapeo que tu sugeriste y luego de algunos ajustes
ya funciona igual que el query. Los ajustes que hice fueron:
1- Cambie los campos a propiedades para hacerlo mas rapido, no significa que
toque hacerlo con propieades solo que tendrias que colocar access="field".
2- En el mapeo de <union-subclass> si fue necesario colocar Abstract =
"True" de lo contrario verificando con el SchemaExport SI generaria una
tabla para Party.
3- En el mapeo de Customer->Party el <many-to-one> tiene el property ="Party" pero deberia ser property="Actor".
4- En tu clase de Customer existe una propiedad de tipo Party llamada Actor.
<class name="Party" abstract="true">
<id name="Id">
<generator class="guid.comb"/>
</id>
<union-subclass name="Person" table="People">
<property name="FirstName"/>
<property name="LastName"/>
</union-subclass>
<union-subclass name="Company" table="Companies">
<property name="CompanyName"/>
</union-subclass>
</class>
<class name="Customer" table="Customers">
<id name="Id">
<generator class="guid.comb"/>
</id>
<many-to-one name="Actor" cascade="save-update"
unique="true" column="PartyId"/>
</class>
<class name="Order" table="Orders">
<id name="Id">
<generator class="guid.comb"/>
</id>
<many-to-one name="Customer" class="Customer" column="CustomerId"/>
</class>
public class Order
{
public virtual Guid Id
{
get;
set;
}
public virtual Customer Customer
{
get;
set;
}
}
public class Party
{
public virtual Guid Id
{
get;
set;
}
}
public class Customer
{
public virtual Guid Id
{
get;
set;
}
public virtual Party Actor
{
get;
set;
}
}
public class Company : Party
{
public virtual string CompanyName
{
get;
set;
}
}
public class Person : Party
{
public virtual string FirstName
{
get;
set;
}
public virtual string LastName
{
get;
set;
}
}
////// Program.cs
static void Main(string[] args)
{
var configuration = new Configuration().Configure();
new SchemaExport(configuration).Create(true, true);
var sessionFactory = configuration.BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var result = session.CreateQuery("select o from Order o join fetch o.Customer c join fetch c.Actor p").List<Domain.Order>();
Console.WriteLine(result.Count);
}
}
Console.ReadLine();
}
2- En el mapeo de <union-subclass> si fue necesario colocar Abstract =
"True" de lo contrario verificando con el SchemaExport SI generaria una
tabla para Party.
3- En el mapeo de Customer->Party el <many-to-one> tiene el property ="Party" pero deberia ser property="Actor".
4- En tu clase de Customer existe una propiedad de tipo Party llamada Actor.
Asi que tienes que cambiar el query para que el join sea c.Actor en lugar de c.Party.