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
