Skip to main content

@ViewEntity con Jmoordb-core

 @ViewEntity con Jmoordb-core

Ofrece la posibilidad de crear Vistas de una entidad e incorporarlas dentro de otra entidad, documento embebido o vista mediante el uso de la anotaciĆ³n @ViewEntity se define una vista y se integra mediante el uso de @ViewReferenced.

Las vistas en jmoordb-core permiten realizar operasciones C.R.U.D. y se pueden integrar en otras vistas, entidades y documentos embebidos.



Un ejemplo de documento  almacenado en MongoDB




Mostrare un ejemplo de una referencia sin el uso de vistas.

Declare una clase de tipo @DocumentEmbeddable

@DocumentEmbeddable
public class Profile {
    @Ignore
    private Long id;
     
    @Referenced(from = "applicative", localField = "idapplicative")
    private Applicative applicative;
    @Referenced(from = "role", localField = "idrole")    
    private Role role;
    @Referenced(from = "departament", localField = "iddepartament")
    private Departament departament;
   //set/get
   }
   

Declare la entidad User

@Entity()
public class User {

    @Id(autogeneratedActive = AutogeneratedActive.ON)
    private Long iduser;
    @Column
    private String username;

    @Column
    private String cellphone;
    @Column
    private String email;
    @Column
    private String identificationcard;
    @Column
    private String sex;
    @Column
    private String socialsecuritynumber;
    @Column
    private String name;
    @Column
    private String password;
    @Column
    private String photo;

    @Column
    private Date dateofbirth;

    @Referenced(from = "central", localField = "idcentral")
    private Central central;

    @Embedded
    List<Profile> profile;
    
    @Column
    private Boolean active;


Omitiremos las otras declaraciones de entidades para no hacer muy larga la demostraciĆ³n.


@Entity
public class Departament {

    @Id(autogeneratedActive = AutogeneratedActive.ON)
    private Long iddepartament;
    @Column
    private String departament;
    @Column
    private String shortname;

    @Column
    private Boolean active;

    @Referenced(from = "central", localField = "idcentral")
    private Central central;
    
    // set/get
 }
 
 @Entity
public class Role {

    @Id(autogeneratedActive = AutogeneratedActive.ON)
    private Long idrole;
    @Column
    private Boolean active;

    @Column
    private String role;
    //set/get
    
}


















.


Applicative

@Entity
public class Applicative {
    @Id(autogeneratedActive = AutogeneratedActive.ON)
    private Long idapplicative;
    @Column
    private Boolean active;
    @Column
    private String applicative;
    @Column
    private String description;
    @Column
    private String image;
    @Column
    private String path;
    @Column
    private String shortname;
    @Embedded
    List<Applicativerole> applicativerole;
    @Embedded
    List<Emailconfiguration> emailconfiguration;
    @Embedded
    List<Applicativeprivilege> applicativeprivilege;    
    //set/get    
 }  


 Tenga presente que deberĆ” crear una entidad y un repositorio para cada colecciĆ³n de la base de datos que usamos en el ejemplo.


@Repository(entity = User.class)
public interface UserRepository extends CrudRepository<User, Long> {
    @Find
    public Optional<User> findByUsername(String username); 
    @Lookup
    public List<User> lookup(Search search);
}


Creee un Controller con Eclipse Microprofile.io para consultar la colecciĆ³n User



@Path("user")
public class UserController {

   @Inject
    UserRepository userRepository;
    
    @GET
    @RolesAllowed({"admin"})
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
        
    
    public List<User> findAll() {     
        return userRepository.findAll();
    }
    
}

Podemos observar el tamaƱo que nos devuelve ya que al consultar User , obtiene la lista de documento sembebidos Profile(applicative,(tiene documentos embebidos) ,role(es una entidad siemple),Departamente  (tiene referencia a Central y Central a Institution)). Tambien se procesa la referencia a Central y esta tiene referencia a Instirution.

Como puede observar son muchas referencias internas, que tal vez no necesitamos en nuestra aplicaciĆ³n

Al hacer la consulta, insertando varios documentos con referencias internas podemos obtener una salida como la siguiente.



Obtendrƭamos un JSON de gran tamaƱo


@ViewEntity


No necesitamos que se ejecuten consultas sobre referencias internas, ya que deseamos un mejor perfomance de la aplicaciĆ³n y por ejemplo cuando consulto Applicative no deseo obtener todos los elementos, y cuando consulto Departament no necesito que internamente consulte Central ni Institution que son referencias internas.


Cree una vista mediante la anotaciĆ³n   @ViewEntity, observe que solo colocamos algunos atributos omitimos la lista de documentos embebidos
@ViewEntity(collection = "applicative")
public class ApplicativeView {

    @Id(autogeneratedActive = AutogeneratedActive.ON)
    private Long idapplicative;
    @Column
    private Boolean active;

    @Column
    private String applicative;
    @Column
    private String description;

    @Column
    private String image;
    @Column
    private String path;
    @Column

    private String shortname;
    //set/get
    
   }
   

DepartamentView, eliminamos la referencia a Central.
@ViewEntity(collection = "departament")
public class DepartamentView {

    @Id(autogeneratedActive = AutogeneratedActive.ON)
    private Long iddepartament;
    @Column
    private String departament;
    @Column
    private String shortname;

    @Column
    private Boolean active;
    //set/get
    
   }
   


Modifique Profile para que utilice las vistas mediante @ViewReferenced

@DocumentEmbeddable
public class Profile {

    @Ignore
    private Long id;

    @ViewReferenced(from = "applicative", localField = "idapplicative")
    private ApplicativeView applicativeView;
    @Referenced(from = "role", localField = "idrole")
    private Role role;
    @ViewReferenced(from = "departament", localField = "iddepartament")
    private DepartamentView departamentView;

    @Column
    private Boolean active;
    
    //set/get
    
   }

Defina una vista para Central eliminando la referencia a Insitution
@ViewEntity(collection = "central")
public class CentralView {
    @Id
    private Long idcentral;
    @Column
    private String central;
    @Column
    private Boolean active;
    //set/get
    
   }
   
Es necesario definir un Repositorio para cada vista de la misma manera en que lo define para cada Entidad
@Repository(entity = DepartamentView.class,collection = "departament")
public interface DepartamentViewRepository extends CrudRepository<DepartamentView, Long> {
    @Find
    public Optional<DepartamentView> findByDepartament(String departament);
    
    @Lookup
public List<DepartamentView> lookup(Search search);
}
   }
   

Edite User.java y coloque un @ViewReferenced a CentralView

@Entity()
public class User {

    @Id(autogeneratedActive = AutogeneratedActive.ON)
    private Long iduser;
    @Column
    private String username;

    @Column
    private String cellphone;
    @Column
    private String email;
    @Column
    private String identificationcard;
    @Column
    private String sex;
    @Column
    private String socialsecuritynumber;
    @Column
    private String name;
    @Column
    private String password;
    @Column
    private String photo;

    @Column
    private Date dateofbirth;

    @ViewReferenced(from = "central", localField = "idcentral")
    private CentralView centralView;

    @Embedded
    List<Profile> profile;
    
    @Column
    private Boolean active;

   }


Al realizar la consulta puede observar que el tiempo de respuesta es menor y el tamaƱo del archivo JSON es de 98.19k, comparado con los 261.58kb si usamos referencias.

Conclusiones

  • @ViewEntity permite mejorar los tiempos de respuesta y elimina el llamado a referencias internas en las clases que se implementan.
  • Es fĆ”cil de utilizar
  • Necesita diseƱar adecuadamente las funcionalidades para aprovechar los beneficios de las mismas.
  • Se esta trabajando en el soporte de  jmoordb-core para la especificaciĆ³n Jakarta NoSQL.


Comments

Popular posts from this blog

Tutorial bƔsico de aplicaciones Web con NetBeans parte 1

NetBeans ofrece un excelente soporte para el desarrollo de aplicaciones Web, en esta ocasiĆ³n lo haremos utilizando el Framework Java Server Faces 2.0. En el Menu Seleccionamos Nuevo->Proyecto y luego en Categorias Java Web y en tipo de Proyectos Web  Application indicamos el nombre del proyecto Seleccinamos el servidor Web, usamos GlassFish ya que este soporta EJB3.0 y JSF 2.0 Framework Java Server Faces El IDE genera el esquelto del proyecto Web Pages   almacenamos las paginas .html, xhtml, jsf, los archivos de recursos, los scripts .js, imagenes Source Packages    Son las clases Java  Test Packages    Son las clases que usamos para los Test Libraries     Tenemos las bibliotecas de Java y GlassFish necesarias para ejecutar la aplicaciĆ³n Web. Test Libraries     EstĆ”n las bibliotecas usadas para los test  Configuration Files    Archivos de configuraciĆ³n de la aplicaciĆ³n. Ejecutamos la...

Incrementar Memoria NetBeans

Algunas veces necesitamos incrementar la memoria para un mejor rendimiento. http://www.netbeans.org/community/releases/55/uml-download.html Este es un ejemplo para UML. DescripciĆ³n en ingles. Increasing Memory Settings (applicable to all builds) The default memory settings for NetBeans should be increased for UML projects. If you have the available memory, Locate your NetBeans installation directory ($install_dir). This can be found by starting up NetBeans and selecting Help -> About then select the Detail tab. Edit the $install_dir/etc/netbeans.conf file. Find the line defining netbeans_default_options . Increase the maximum memory attribute to -J-Xmx512m. If you experience heap overflows while working with larger files, you should increase this value further.

Cambiando el estado de un checkbox

Cambiando el Estado de un CheckBox Algunas veces deseamos controlar el estado de un checkbox o cambiarlo segĆ¹n determinadas condiciones. Pasos: 1. Creamos un proyecto Web. 2. En el diseƱador agregamos un checkbox y dos botones. * Dar click derecho en el checkbox y luego seleccionar Add Binding Attribute, para agregar los atributos al checkbox, de manera que los podamos usar en nuestro cĆ³digo. Generando automĆ”ticamente private Checkbox checkbox1 = new Checkbox(); public Checkbox getCheckbox1() { return checkbox1; } public void setCheckbox1(Checkbox c) { this.checkbox1 = c; } 3.Damos click derecho en el botĆ³n Habilitar, y seleccionamos Edit Action Event Handler. A continuaciĆ³n, agregamos el cĆ³digo: this.checkbox1.setSelected(true);, el mĆ©todo setSelected con valor true, marca el checkbox como seleccionado, y un valor de false, quita la marca. public String button1_action() { // TODO: Process the action. Return value is a navigation // ...