fyi, I've added a new chapter to the "Fundamentals" guide [1] capturing some of this; plan is to add further hints and tips on JDO mappings into this new chapter.
Thx Dan [1] http://isis.apache.org/guides/ugfun.html#_ugfun_jdo-mappings 2016-07-13 16:16 GMT+01:00 José Alejandro Manaure Martinez < [email protected]>: > Thanks Oscar > I already reviewed and commented on the outcome. > Best Regards. > > El 13 de julio de 2016, 10:05, Óscar Bou - GOVERTIS <[email protected]> > escribió: > >> Thanks. >> >> You must define JDO mappings for 1-n relationships. >> >> >> In Regional: >> >> @CollectionLayout(render = RenderType.EAGERLY,paged=3) >> public List<Departamento> getDepartamentos () { >> return departamentos; >> } >> >> >> Should be: >> >> @CollectionLayout(render = RenderType.EAGERLY,paged=3) >> >> @Persistent(mappedBy = “regional", dependentElement = "true") >> >> public List<Departamento> getDepartamentos () { >> return departamentos; >> } >> >> >> >> >> Assuming there’s a “regional” property on the “Departamento” entity. >> >> >> In the Eclipse and IntelliJ sections you will find templates to install >> on your IDE for those common relationships: >> >> https://isis.apache.org/guides/dg.html#_dg_ide_eclipse >> >> https://isis.apache.org/guides/dg.html#_dg_ide_intellij_live-templates >> >> >> All Apache Isis templates will start with the “is” prefix. >> >> Those specifically about JDO, start with “isjd”. >> >> >> When you’re creating a simple property, templates will start with “isjdp”. >> >> And with collections, “isjdc”. >> >> In your case, you need to annotate for a 1-n relationship, the Collection >> side. >> >> So the proper template could be: >> - “isjdc-1n-b-fk” named “JDO Collection (1:n bidir, implemented using a >> foreign key)” >> - “isjdc-1n-b-jt” named "JDO Collection (1:n bidir, implemented using a >> join table)” >> >> >> HTH, >> >> Oscar >> >> >> >> >> >> >> >> >> >> El 13 jul 2016, a las 16:48, José Alejandro Manaure Martinez < >> [email protected]> escribió: >> >> *Ciudad.java* >> package domainapp.dom.mesaAyudaPrestadores; >> >> >> import java.util.List; >> >> import javax.inject.Inject; >> import javax.jdo.annotations.Column; >> import javax.jdo.annotations.DatastoreIdentity; >> import javax.jdo.annotations.IdGeneratorStrategy; >> import javax.jdo.annotations.IdentityType; >> import javax.jdo.annotations.PersistenceCapable; >> >> import org.apache.isis.applib.annotation.Action; >> import org.apache.isis.applib.annotation.Auditing; >> import org.apache.isis.applib.annotation.CollectionLayout; >> import org.apache.isis.applib.annotation.DomainObject; >> import org.apache.isis.applib.annotation.MemberGroupLayout; >> import org.apache.isis.applib.annotation.MemberOrder; >> import org.apache.isis.applib.annotation.RenderType; >> import org.apache.isis.applib.annotation.SemanticsOf; >> import org.apache.isis.applib.services.eventbus.ActionDomainEvent; >> import org.apache.isis.applib.services.repository.RepositoryService; >> >> import domainapp.dom.mesaAyudaPrestadores.Compania.DeleteDomainEvent; >> >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.EC5D5AC6-E099-A6B8-7DBB-F44B024BCB75] >> // </editor-fold> >> @MemberGroupLayout( columnSpans={6,0,0,6}, left={"GENERAL"} ) >> @DomainObject( auditing=Auditing.ENABLED, objectType="Ciudad" ) >> >> @PersistenceCapable(identityType=IdentityType.DATASTORE,table="TBL_CIUDAD") >> >> @DatastoreIdentity(strategy=IdGeneratorStrategy.IDENTITY,column="idCiudad") >> public class Ciudad { >> >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.B913569E-C2AF-0FF1-3177-AF92DBB927E1] >> // </editor-fold> >> // @Inject >> private String descCiudad; >> // @Inject >> private String codigoLegal; >> >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.D242788F-C26C-3D14-2DED-E439010AC666] >> // </editor-fold> >> // @Inject >> private List<Sucursal> sucursales; >> >> // @Inject >> private Departamento departamento; >> >> >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.5E23B2B1-F2DB-C652-CA58-D2C746738947] >> // </editor-fold> >> public Ciudad () { >> } >> >> public String title() { >> return descCiudad; >> } >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.236F1F8A-B466-2D0E-91A8-0601283F0460] >> // </editor-fold> >> @Column(allowsNull="false",length=50) >> @MemberOrder(name="NombreCiudad",sequence="1") >> public String getDescCiudad () { >> return descCiudad; >> } >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.1304E2B9-7316-78A7-4D9A-A3A597241FAA] >> // </editor-fold> >> public void setDescCiudad (String val) { >> this.descCiudad = val; >> } >> >> >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.C5E932AF-283F-521A-931C-BAF12217286A] >> // </editor-fold> >> @CollectionLayout(render = RenderType.EAGERLY,paged=3) >> public List<Sucursal> getSucursales () { >> return sucursales; >> } >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.5F6CEB5A-A5D8-0748-860A-F5199F8D0CF3] >> // </editor-fold> >> public void setSucursales (List<Sucursal> val) { >> this.sucursales = val; >> } >> >> @CollectionLayout(render = RenderType.EAGERLY,paged=3) >> public Departamento getDepartamento() { >> return departamento; >> } >> >> public void setDepartamento(Departamento departamento) { >> this.departamento = departamento; >> } >> @Column(allowsNull="false") >> @MemberOrder(name="CodigoLegalCiudad",sequence="2") >> public String getCodigoLegal() { >> return codigoLegal; >> } >> >> public void setCodigoLegal(String codigoLegal) { >> this.codigoLegal = codigoLegal; >> } >> >> public static class DeleteDomainEvent extends >> ActionDomainEvent<Ciudad> {} >> @Action( >> domainEvent = DeleteDomainEvent.class, >> semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE >> ) >> public void borrarCiudad() { >> repositoryService.remove(this); >> } >> @javax.inject.Inject >> RepositoryService repositoryService; >> } >> >> >> >> ******************************************************************************************* >> >> *CiudadRepo.java* >> package domainapp.dom.mesaAyudaPrestadores; >> >> import java.util.List; >> >> import javax.inject.Inject; >> >> import org.apache.isis.applib.DomainObjectContainer; >> import org.apache.isis.applib.annotation.Action; >> import org.apache.isis.applib.annotation.ActionLayout; >> import org.apache.isis.applib.annotation.BookmarkPolicy; >> import org.apache.isis.applib.annotation.DomainService; >> import org.apache.isis.applib.annotation.DomainServiceLayout; >> import org.apache.isis.applib.annotation.DomainServiceLayout.MenuBar; >> import org.apache.isis.applib.services.repository.RepositoryService; >> import org.apache.isis.applib.util.ObjectContracts; >> >> import org.apache.isis.applib.annotation.MemberOrder; >> import org.apache.isis.applib.annotation.NatureOfService; >> import org.apache.isis.applib.annotation.ParameterLayout; >> import org.apache.isis.applib.annotation.SemanticsOf; >> >> @DomainService(nature=NatureOfService.VIEW_MENU_ONLY, >> repositoryFor=CiudadRepo.class) >> >> @DomainServiceLayout(menuBar=MenuBar.PRIMARY,menuOrder="30",named="Parametrización") >> public class CiudadRepo { >> @Inject >> private DomainObjectContainer container; >> @Inject >> private DepartamentoRepo DeptoRep; >> @MemberOrder(sequence="30.3") >> @Action(semantics = SemanticsOf.SAFE) >> @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT) >> public List<Ciudad> listarCiudades() { >> return repositoryService.allInstances(Ciudad.class); >> } >> public Ciudad CrearCiudad( >> final @ParameterLayout(named="NombreCiudad") String descCiudad, >> final @ParameterLayout(named="CodigoLegalCiudad") String >> codigoLegalCiudad, >> final @ParameterLayout(named="Departamento") Departamento depto){ >> >> Ciudad ciu = container.newTransientInstance(Ciudad.class); >> ciu.setDescCiudad(descCiudad); >> ciu.setCodigoLegal(codigoLegalCiudad); >> ciu.setDepartamento(depto); >> container.persist( ciu ); >> return ciu; >> } >> public List<Departamento> choices2CrearCiudad(){ >> return DeptoRep.listarDepartamentos(); >> } >> @javax.inject.Inject >> RepositoryService repositoryService; >> >> } >> >> >> ***************************************************************************************************************** >> Regional.java >> package domainapp.dom.mesaAyudaPrestadores; >> >> >> import java.util.List; >> >> import javax.jdo.annotations.Column; >> import javax.jdo.annotations.DatastoreIdentity; >> import javax.jdo.annotations.IdGeneratorStrategy; >> import javax.jdo.annotations.IdentityType; >> import javax.jdo.annotations.PersistenceCapable; >> >> import org.apache.isis.applib.annotation.Action; >> import org.apache.isis.applib.annotation.Auditing; >> import org.apache.isis.applib.annotation.DomainObject; >> import org.apache.isis.applib.annotation.DomainObjectLayout; >> import org.apache.isis.applib.annotation.MemberGroupLayout; >> import org.apache.isis.applib.annotation.MemberOrder; >> import org.apache.isis.applib.annotation.Nature; >> >> import org.apache.isis.applib.annotation.CollectionLayout; >> import org.apache.isis.applib.annotation.RenderType; >> import org.apache.isis.applib.annotation.SemanticsOf; >> import org.apache.isis.applib.services.eventbus.ActionDomainEvent; >> import org.apache.isis.applib.services.repository.RepositoryService; >> >> import domainapp.dom.mesaAyudaPrestadores.Compania.DeleteDomainEvent; >> >> import javax.inject.Inject; >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.52354FC3-B6D7-4F76-B582-16DA9C3AACCE] >> // </editor-fold> >> @MemberGroupLayout( columnSpans={6,0,0,6}, left={"GENERAL"} ) >> @DomainObject( auditing=Auditing.ENABLED, objectType="Regional" ) >> >> @PersistenceCapable(identityType=IdentityType.DATASTORE,table="TBL_REGIONAL") >> >> @DatastoreIdentity(strategy=IdGeneratorStrategy.IDENTITY,column="idRegional") >> public class Regional { >> >> //@Inject >> private Departamento departamento; >> //@Inject >> private DepartamentoRepo deptoRep; >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.FCF04A4C-92D1-3041-75E2-E9C9E28ADF2B] >> // </editor-fold> >> private String descRegional; >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.151ACBA2-F999-E997-353C-72CF8366B553] >> // </editor-fold> >> @Inject >> private List<Departamento> departamentos; >> >> >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // #[regen=yes,id=DCE.43B02CC0-C04D-1891-32C3-837AC4D5D887] >> // </editor-fold> >> public Regional () { >> } >> >> >> >> public String title() { >> return descRegional; >> } >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.9E28EE52-7F8D-DDD5-CB2F-52129E9B8E6C] >> // </editor-fold> >> @CollectionLayout(render = RenderType.EAGERLY,paged=3) >> public List<Departamento> getDepartamentos () { >> return departamentos; >> } >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.EC578B88-88BB-E59A-7A5E-F0BA857EEF27] >> // </editor-fold> >> public void setDepartamentos (List<Departamento> val) { >> this.departamentos = val; >> } >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.D4878FF2-8F3B-B88B-5117-F0668EFB6A36] >> // </editor-fold> >> @Column(allowsNull="false", length=120) >> @MemberOrder(name="NombreRegional",sequence="1") >> public String getDescRegional () { >> return descRegional; >> } >> >> // <editor-fold defaultstate="collapsed" desc=" UML Marker "> >> // >> #[regen=yes,regenBody=yes,id=DCE.CACCC27F-51B0-84B1-3F01-015920EDCA60] >> // </editor-fold> >> public void setDescRegional (String val) { >> this.descRegional = val; >> } >> >> public static class DeleteDomainEvent extends >> ActionDomainEvent<Regional> {} >> @Action( >> domainEvent = DeleteDomainEvent.class, >> semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE >> ) >> public void borrarRegional() { >> repositoryService.remove(this); >> } >> @javax.inject.Inject >> RepositoryService repositoryService; >> >> >> } >> >> >> >> ********************************************************************************************** >> RegionalRepo.java >> package domainapp.dom.mesaAyudaPrestadores; >> >> import java.util.List; >> >> import javax.inject.Inject; >> >> import org.apache.isis.applib.DomainObjectContainer; >> import org.apache.isis.applib.annotation.Action; >> import org.apache.isis.applib.annotation.ActionLayout; >> import org.apache.isis.applib.annotation.BookmarkPolicy; >> import org.apache.isis.applib.annotation.DomainService; >> import org.apache.isis.applib.annotation.DomainServiceLayout; >> import org.apache.isis.applib.annotation.DomainServiceLayout.MenuBar; >> import org.apache.isis.applib.services.repository.RepositoryService; >> import org.apache.isis.applib.util.ObjectContracts; >> >> import org.apache.isis.applib.annotation.MemberOrder; >> import org.apache.isis.applib.annotation.NatureOfService; >> import org.apache.isis.applib.annotation.ParameterLayout; >> import org.apache.isis.applib.annotation.SemanticsOf; >> >> @DomainService(nature=NatureOfService.VIEW_MENU_ONLY, >> repositoryFor=CompaniaRepo.class) >> >> @DomainServiceLayout(menuBar=MenuBar.PRIMARY,menuOrder="10",named="Parametrización") >> public class RegionalRepo { >> >> @Inject >> private DomainObjectContainer container; >> @MemberOrder(sequence="10.3") >> @Action(semantics = SemanticsOf.SAFE) >> @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT) >> public List<Regional> ListarRegionales() { >> return repositoryService.allInstances(Regional.class); >> } >> public Regional CrearRegional( >> final @ParameterLayout(named="NombreRegional") String descRegional){ >> Regional reg = container.newTransientInstance(Regional.class); >> reg.setDescRegional(descRegional); >> container.persist( reg ); >> return reg; >> } >> @javax.inject.Inject >> RepositoryService repositoryService; >> } >> >> El 13 de julio de 2016, 9:39, Óscar Bou - GOVERTIS <[email protected]> >> escribió: >> >>> Hola, Jose Alejandro. >>> >>> Seems screenshots are allowed, but attachments removed. >>> >>> Can you copy-n-paste Java code for relevant classes? >>> >>> >>> El 13 jul 2016, a las 16:37, José Alejandro Manaure Martinez < >>> [email protected]> escribió: >>> >>> Hi Oscar >>> Attached class code. >>> >>> >>> El 13 de julio de 2016, 9:32, Óscar Bou - GOVERTIS <[email protected]> >>> escribió: >>> >>>> Hi Jose Alejandro. >>>> >>>> Only the screenshot visible, at least for me. >>>> >>>> Please, can you send the code for relevant properties and collections >>>> in all classes ? >>>> >>>> Cheers, >>>> >>>> Oscar >>>> >>>> >>>> El 13 jul 2016, a las 16:27, José Alejandro Manaure Martinez < >>>> [email protected]> escribió: >>>> >>>> Hi Dan >>>> >>>> I have a relationship between classes where one or more cities belong >>>> to a department, and one or more departments belong to a regional. For >>>> Example in US: Albany, Bronx and Brome are counties that belong to State of >>>> New York, and State of New York belong to Mid-Atlantic (Region). When these >>>> relationships are created in Apache Isis, Framework respects relations >>>> children to parents, however, when I want to show the children of a parent >>>> the child list remains empty. >>>> >>>> >>>> Attached declared classes and capture of application to illustrate the >>>> question >>>> >>>> >>>> <image.png> >>>> -- >>>> [image: Logo] >>>> >>>> José Alejandro Manaure >>>> *Project Manager* >>>> Tel: (57) 1 703 17 77 >>>> Cel: (57) 312 5476188 >>>> E-mail: [email protected] >>>> Calle 93 # 19b - 66 Ofc 202 >>>> Bogotá D.C., Colombia >>>> www.ticxar.com >>>> [image: facebook] >>>> <https://www.facebook.com/pages/Ticxar/446503822192581> [image: >>>> twitter] <http://twitter.com/ticxar> [image: linkedIn] >>>> <https://www.linkedin.com/company/ticxar> >>>> >>>> >>>> <govertis1.png> >>>> >>>> Óscar Bou Bou >>>> Socio - IT & GRC Management Services Director >>>> m: +34 620 267 520 >>>> s: <http://www.govertis.com/>www.govertis.com e: [email protected] >>>> >>>> LinkedIn: https://www.linkedin.com/in/oscarbou >>>> Twitter: @oscarbou <https://twitter.com/oscarbou> >>>> >>>> >>>> >>>> Este mensaje y los ficheros anexos son confidenciales. Los mismos >>>> contienen información reservada que no puede ser difundida. Si usted ha >>>> recibido este correo por error, tenga la amabilidad de eliminarlo de su >>>> sistema y avisar al remitente mediante reenvío a su dirección electrónica; >>>> no deberá copiar el mensaje ni divulgar su contenido a ninguna persona. >>>> >>>> Su dirección de correo electrónico junto a sus datos personales constan >>>> en un fichero titularidad de GOVERTIS ADVISORY SERVICES, S.L. cuya >>>> finalidad es la de mantener el contacto con Ud. Si quiere saber de qué >>>> información disponemos de Ud., modificarla, y en su caso, cancelarla, puede >>>> hacerlo enviando un escrito al efecto, acompañado de una fotocopia de su >>>> D.N.I. a la siguiente dirección: GOVERTIS ADVISORY SERVICES, S.L. Avda >>>> Cortes Valencianas, 58 – 8º - 6ª. 46015 - Valencia, y Paseo de la >>>> Castellana, 153, 28045 - MADRID. Asimismo, es su responsabilidad comprobar >>>> que este mensaje o sus archivos adjuntos no contengan virus informáticos, y >>>> en caso que los tuvieran eliminarlos. >>>> >>>> >>> >>> >>> -- >>> [image: Logo] >>> >>> José Alejandro Manaure >>> *Project Manager* >>> Tel: (57) 1 703 17 77 >>> Cel: (57) 312 5476188 >>> E-mail: [email protected] >>> Calle 93 # 19b - 66 Ofc 202 >>> Bogotá D.C., Colombia >>> www.ticxar.com >>> [image: facebook] >>> <https://www.facebook.com/pages/Ticxar/446503822192581> [image: twitter] >>> <http://twitter.com/ticxar> [image: linkedIn] >>> <https://www.linkedin.com/company/ticxar> >>> >>> >>> >>> Óscar Bou Bou >>> Socio - IT & GRC Management Services Director >>> m: +34 620 267 520 >>> s: <http://www.govertis.com/>www.govertis.com e: [email protected] >>> >>> LinkedIn: https://www.linkedin.com/in/oscarbou >>> Twitter: @oscarbou <https://twitter.com/oscarbou> >>> >>> >>> >>> Este mensaje y los ficheros anexos son confidenciales. Los mismos >>> contienen información reservada que no puede ser difundida. Si usted ha >>> recibido este correo por error, tenga la amabilidad de eliminarlo de su >>> sistema y avisar al remitente mediante reenvío a su dirección electrónica; >>> no deberá copiar el mensaje ni divulgar su contenido a ninguna persona. >>> >>> Su dirección de correo electrónico junto a sus datos personales constan >>> en un fichero titularidad de GOVERTIS ADVISORY SERVICES, S.L. cuya >>> finalidad es la de mantener el contacto con Ud. Si quiere saber de qué >>> información disponemos de Ud., modificarla, y en su caso, cancelarla, puede >>> hacerlo enviando un escrito al efecto, acompañado de una fotocopia de su >>> D.N.I. a la siguiente dirección: GOVERTIS ADVISORY SERVICES, S.L. Avda >>> Cortes Valencianas, 58 – 8º - 6ª. 46015 - Valencia, y Paseo de la >>> Castellana, 153, 28045 - MADRID. Asimismo, es su responsabilidad comprobar >>> que este mensaje o sus archivos adjuntos no contengan virus informáticos, y >>> en caso que los tuvieran eliminarlos. >>> >>> >> >> >> -- >> [image: Logo] >> >> José Alejandro Manaure >> *Project Manager* >> Tel: (57) 1 703 17 77 >> Cel: (57) 312 5476188 >> E-mail: [email protected] >> Calle 93 # 19b - 66 Ofc 202 >> Bogotá D.C., Colombia >> www.ticxar.com >> [image: facebook] >> <https://www.facebook.com/pages/Ticxar/446503822192581> [image: twitter] >> <http://twitter.com/ticxar> [image: linkedIn] >> <https://www.linkedin.com/company/ticxar> >> >> >> >> Óscar Bou Bou >> Socio - IT & GRC Management Services Director >> m: +34 620 267 520 >> s: <http://www.govertis.com>www.govertis.com e: [email protected] >> >> LinkedIn: https://www.linkedin.com/in/oscarbou >> Twitter: @oscarbou <https://twitter.com/oscarbou> >> >> >> >> Este mensaje y los ficheros anexos son confidenciales. Los mismos >> contienen información reservada que no puede ser difundida. Si usted ha >> recibido este correo por error, tenga la amabilidad de eliminarlo de su >> sistema y avisar al remitente mediante reenvío a su dirección electrónica; >> no deberá copiar el mensaje ni divulgar su contenido a ninguna persona. >> >> Su dirección de correo electrónico junto a sus datos personales constan >> en un fichero titularidad de GOVERTIS ADVISORY SERVICES, S.L. cuya >> finalidad es la de mantener el contacto con Ud. Si quiere saber de qué >> información disponemos de Ud., modificarla, y en su caso, cancelarla, puede >> hacerlo enviando un escrito al efecto, acompañado de una fotocopia de su >> D.N.I. a la siguiente dirección: GOVERTIS ADVISORY SERVICES, S.L. Avda >> Cortes Valencianas, 58 – 8º - 6ª. 46015 - Valencia, y Paseo de la >> Castellana, 153, 28045 - MADRID. Asimismo, es su responsabilidad comprobar >> que este mensaje o sus archivos adjuntos no contengan virus informáticos, y >> en caso que los tuvieran eliminarlos. >> >> > > > -- > [image: Logo] > > José Alejandro Manaure > *Project Manager* > Tel: (57) 1 703 17 77 > Cel: (57) 312 5476188 > E-mail: [email protected] > Calle 93 # 19b - 66 Ofc 202 > Bogotá D.C., Colombia > www.ticxar.com > [image: facebook] > <https://www.facebook.com/pages/Ticxar/446503822192581> [image: twitter] > <http://twitter.com/ticxar> [image: linkedIn] > <https://www.linkedin.com/company/ticxar> >
