@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