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
