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

2011/6/2 Carlos Peix <[email protected]>

> Hola Nestor,
>
> 2011/6/2 Nestor Rodriguez <[email protected]>
>
>>
>>    1. Bueno si mapeas a Party como Abstract = "True" no te genenera una
>>    tabla.  Tambien podrias elegir mapear la herencia con <subclass...>.
>>
>> Si no me equivoco sugeris este mapping:
>
> <class name="Party" abstract="true">
> <id name="Id">
>  <generator class="guid.comb"/>
> </id>
> </class>
>
> <subclass name="Person" extends="Party" table="People">
> <property name="FirstName"/>
>  <property name="LastName"/>
> </subclass>
>
>  <subclass name="Company" extends="Party" table="Companies">
> <property name="CompanyName"/>
>  </subclass>
>
> Pero falla con este error:  "XML validation error: The 'table' attribute is
> not declared.", asumo que se debe al primer mapping
>
>
>>    1. En el mapping del many to one te hace falta colocar el "class =
>>    "Party".
>>
>> Pense que no hacia falta ya que la leer del tipo de la propiedad. Igual no
> cambia anda agregando eso.
>
>
>>    1. 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".
>>
>> Ese query falla con el mismo error que mencione antes.
>
>
>>    1. 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
>>
>> Si, estoy seguro y es por diseno. Cuando creo el rol Customer es para uno
> y solo un Party (Person o Company). es una relacion one-to-one pero he visto
> que algunos recomiendan una many-to-one con el unique="true"
>
> Saludos,
>> Nestor Andres Rodriguez
>>
>>
> Muchas gracias
>
> ----------------------------------
> Carlos Peix
>
>
>> 2011/6/2 Carlos Peix <[email protected]>
>>
>>> Hola Carlos, gracias por la respuesta.
>>>
>>> El mapping que sugeris me parece que no es lo que necesito porque
>>> requiere una tabla para Party que no es lo que cuiero.
>>>
>>> Pude hacerlo de esta manera:
>>>
>>> <class name="Party">
>>> <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>
>>>
>>> Pero el query me da este error:
>>>
>>> Invalid join: c.Party [from Order o join fetch o.Customer c join fetch
>>> c.Party p]
>>>
>>> Insisto, lo que yo quiero es cargar Order, su Customer y su Party eager.
>>> Se puede?
>>>
>>> ----------------------------------
>>> Carlos Peix
>>>
>>>
>>> 2011/6/2 Carlos Cocom <[email protected]>
>>>
>>>> Es necesario mapear la clase base y después los mapping para las sub
>>>> clases o extensiones esto también se pueden usando <union-subclass> pero
>>>> esta te crearía una tabla por clase excepto la común
>>>>
>>>> <?xml version="1.0" encoding="utf-8" ?>
>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>>>> assembly="pruebas.nh.modelo"
>>>> namespace="pruebas.nh.modelo">
>>>> <class name="Party">
>>>> <id name="Id">
>>>> <generator class="guid.comb" />
>>>> </id>
>>>> <discriminator column="PartyType" />
>>>> <property name="Location" />
>>>> <property name="Hour" not-null="true" />
>>>> </class>
>>>> </hibernate-mapping>
>>>>
>>>>
>>>> <?xml version="1.0" encoding="utf-8" ?>
>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>>>> assembly="pruebas.nh.modelo"
>>>> namespace="pruebas.nh.modelo">
>>>> <subclass name="Company" extends="Party">
>>>> <property name="CompanyName"/>
>>>> </subclass>
>>>> </hibernate-mapping>
>>>>
>>>>
>>>> <?xml version="1.0" encoding="utf-8" ?>
>>>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>>>> assembly="pruebas.nh.modelo"
>>>> namespace="pruebas.nh.modelo">
>>>> <subclass name="Person" extends="Party">
>>>>  <property name="FirstName"/>
>>>> <property name="LastName"/>
>>>> </subclass>
>>>> </hibernate-mapping>
>>>>
>>>>
>>>> Sobre el query no debería haber ningún problema seria cosa que pruebes y
>>>> comentes
>>>>
>>>>
>>>>
>>>> El 2 de junio de 2011 16:52, Carlos Peix <[email protected]>escribió:
>>>>
>>>>> Sigo con este tema y tengo una duda con eager-loading. El modelo es el
>>>>> que mostre en el post anterior: Order tiene una referencia a Customer y
>>>>> Customer tiene una referencia a Party.
>>>>>
>>>>> Mappings:
>>>>>
>>>>> <class name="Order" table="Orders">
>>>>> ...
>>>>> <many-to-one name="Customer" class="Customer" column="CustomerId"/>
>>>>> </class>
>>>>>
>>>>> <class name="Customer" table="Customers">
>>>>> ...
>>>>> <many-to-one name="Party" cascade="save-update"
>>>>>  unique="true" column="PartyId"/>
>>>>> </class>
>>>>>
>>>>> <import class="Party" />
>>>>>  <class name="Person" table="People">
>>>>> ...
>>>>>  <property name="FirstName"/>
>>>>> <property name="LastName"/>
>>>>> </class>
>>>>>
>>>>> <class name="Company" table="Companies">
>>>>> ...
>>>>> <property name="CompanyName"/>
>>>>> </class>
>>>>>
>>>>> Con esto tengo dos temas, primero que me da un error de compilacion del
>>>>> mapping: "An association from the table Customers refers to an unmapped
>>>>> class: pruebas.nh.modelo.Party", a pesar del import. Que estoy haciendo 
>>>>> mal?
>>>>>
>>>>> Luego me gustaria poder hacer este query (HQL)
>>>>>
>>>>> "from Order o join fetch o.Customer c join fetch c.Party p"
>>>>>
>>>>> Puedo hacer eso?
>>>>>
>>>>> Gracias!
>>>>>
>>>>> ----------------------------------
>>>>> Carlos Peix
>>>>>
>>>>> 2011/6/1 Carlos Peix <[email protected]>
>>>>>
>>>>>> Hola gente,
>>>>>>
>>>>>> Quiero consultarles algo ya que estoy tratando de encontrar una forma
>>>>>> de mapeo mas o menos estandar para un problema mas o menos estandar en 
>>>>>> mis
>>>>>> modelos. La consulta no solo se relaciona con el mapeo en NH, tambien me
>>>>>> interesa determinar la estructura de BD mas adecuada.
>>>>>>
>>>>>> Basicamente es la relacion evento-rol-actor, para que quede mas claro,
>>>>>> permitanme conpartir algunas clases:
>>>>>>
>>>>>> // evento
>>>>>> public class Order {
>>>>>>     Guid _id;
>>>>>>     Customer _customer;
>>>>>> }
>>>>>>
>>>>>> // el rol
>>>>>> public class Customer {
>>>>>>     Guid _id;
>>>>>>     Party _actor;    // (1) u Object _actor
>>>>>> }
>>>>>>
>>>>>> // actores (ver Fowler para teoria sobre Party/Company/Person y
>>>>>> accountability)
>>>>>> public class Company : Party {
>>>>>>     Guid _id;
>>>>>>     string _companyName;
>>>>>> }
>>>>>>
>>>>>> public class Person : Party {
>>>>>>     Guid _id;
>>>>>>     string _firstName;
>>>>>>     string _lastName;
>>>>>> }
>>>>>>
>>>>>> (1) aqui puedo tener definida alguna clase base para los actores que
>>>>>> pueden adoptar el rol de customer (como seria el caso de Party) y otras
>>>>>> veces no, para lo cual tendre que usar Object. Entiendo que esto me 
>>>>>> lleva a
>>>>>> dos respuestas distintas a mi consulta.
>>>>>>
>>>>>> La pregunta es como me conviene mapear la propiedad _actor de
>>>>>> Customer, ya se en el caso en que esta deba ser de tipo Object o Party.
>>>>>>
>>>>>> He probado con any y con many-to-one. Este objeto Customer podria o no
>>>>>> utilizar el mismo valor para el Id que el actor. Opino que lo mejor seria
>>>>>> que no lo hagan. Por ahi con Guids no hay problema pero en otros casos me
>>>>>> restringe.
>>>>>>
>>>>>> Un punto adicional seria que, probablemente, necesite en la entidad
>>>>>> Company o Person una coleccion de todos los roles desempeñados, seria 
>>>>>> como
>>>>>> la relacion opuesta y, en este caso, definitivamente no los roles no van 
>>>>>> a
>>>>>> compartir ninguna clase base salvo, eventualmente, una interfaz "IRol".
>>>>>>
>>>>>> ----------------------------------
>>>>>> Carlos Peix
>>>>>>
>>>>>>
>>>>>  --
>>>>> Para escribir al Grupo, hágalo a esta dirección:
>>>>> [email protected]
>>>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>>>
>>>>
>>>>  --
>>>> Para escribir al Grupo, hágalo a esta dirección:
>>>> [email protected]
>>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>>
>>>
>>>  --
>>> Para escribir al Grupo, hágalo a esta dirección:
>>> [email protected]
>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>
>>
>>  --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
>  --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a