@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.
@ViewEntity
![]() |
@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
}
@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
}
@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
}
@ViewEntity(collection = "central")
public class CentralView {
@Id
private Long idcentral;
@Column
private String central;
@Column
private Boolean active;
//set/get
}
@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);
}
}
@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;
}
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