Thursday, 19 September 2013

Hibernate: Extra queries, many to many relation

Hibernate: Extra queries, many to many relation

I have a many to many relation with extra columns:
rol 0..* -------- 1..* permission
This are my models:
Rol:
@Table(name = "rol", uniqueConstraints = { @UniqueConstraint(columnNames =
"nombre") })
public class Rol implements Serializable{
@Id
@Column(name = "_id")
private String id;
@Column(name = "nombre")
@NotEmpty
private String nombre;
@Column(name = "descripcion")
private String descripcion;
@Column(name = "status")
private String status;
@NotEmpty
@OneToMany(fetch= FetchType.LAZY, mappedBy = "rolPermiso_pk.rol",
orphanRemoval = true, cascade=CascadeType.ALL)
private Set<Rol_Permiso> permisos = new HashSet<Rol_Permiso>(0);
Permiso:
@Entity
@Table(name = "permiso", uniqueConstraints = {
@UniqueConstraint(columnNames = "nombre") })
public class Permiso implements Serializable {
@Id
@Column(name = "_id")
private String id;
@Column(name = "nombre")
@NotNull
private String nombre;
@Column(name = "descripcion")
private String descripcion;
@Column(name = "status")
private String status;
@OneToMany(fetch = FetchType.LAZY, mappedBy =
"rolPermiso_pk.permiso", cascade = CascadeType.ALL)
private Set<Rol_Permiso> roles = new HashSet<Rol_Permiso>(0);
Rol_Permiso:
@Entity
@Table(name = "rol_permiso")
@AssociationOverrides({
@AssociationOverride(name = "rolPermiso_pk.rol", joinColumns =
@JoinColumn(name = "idRol")),
@AssociationOverride(name = "rolPermiso_pk.permiso", joinColumns =
@JoinColumn(name = "idPermiso"))
})
public class Rol_Permiso implements Serializable{
@EmbeddedId
private Rol_PermisoId rolPermiso_pk = new Rol_PermisoId();
@Column(name = "status")
private String status;
Rol_PermisoId:
@Embeddable
public class Rol_PermisoId implements Serializable{
@ManyToOne
private Rol rol;
@ManyToOne
private Permiso permiso;
Im trying to show a list of roles with their permissions. So I create this
query:
public List<Rol> findAllWithPermissions() {
return mySessionFactory.getCurrentSession().createQuery("select
distinct r from Rol r left join fetch r.permisos").list();
}
And this works, but extra queries are made:
DEBUG: org.hibernate.SQL - select distinct rol0_._id as column1_2_0_,
permisos1_.idPermiso as idPermis6_3_1_, permisos1_.idRol as idRol5_3_1_,
rol0_.descripcion as descripc2_2_0_, rol0_.fechaCreacion as
fechaCre3_2_0_, rol0_.fechaModificacion as fechaMod4_2_0_,
rol0_.fechaSincronizacion as fechaSin5_2_0_, rol0_.nombre as nombre6_2_0_,
rol0_.status as status7_2_0_, permisos1_.fechaCreacion as fechaCre1_3_1_,
permisos1_.fechaModificacion as fechaMod2_3_1_,
permisos1_.fechaSincronizacion as fechaSin3_3_1_, permisos1_.status as
status4_3_1_, permisos1_.idRol as idRol5_2_0__, permisos1_.idPermiso as
idPermis6_3_0__, permisos1_.idRol as idRol5_3_0__ from rol rol0_ left
outer join rol_permiso permisos1_ on rol0_._id=permisos1_.idRol
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 1
DEBUG: org.hibernate.SQL - select rol0_._id as column1_2_0_,
rol0_.descripcion as descripc2_2_0_, rol0_.fechaCreacion as
fechaCre3_2_0_, rol0_.fechaModificacion as fechaMod4_2_0_,
rol0_.fechaSincronizacion as fechaSin5_2_0_, rol0_.nombre as nombre6_2_0_,
rol0_.status as status7_2_0_ from rol rol0_ where rol0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 1
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 3
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 5
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 7
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 8
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 9
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 2
DEBUG: org.hibernate.SQL - select rol0_._id as column1_2_0_,
rol0_.descripcion as descripc2_2_0_, rol0_.fechaCreacion as
fechaCre3_2_0_, rol0_.fechaModificacion as fechaMod4_2_0_,
rol0_.fechaSincronizacion as fechaSin5_2_0_, rol0_.nombre as nombre6_2_0_,
rol0_.status as status7_2_0_ from rol rol0_ where rol0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 2
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 6
DEBUG: org.hibernate.SQL - select rol0_._id as column1_2_0_,
rol0_.descripcion as descripc2_2_0_, rol0_.fechaCreacion as
fechaCre3_2_0_, rol0_.fechaModificacion as fechaMod4_2_0_,
rol0_.fechaSincronizacion as fechaSin5_2_0_, rol0_.nombre as nombre6_2_0_,
rol0_.status as status7_2_0_ from rol rol0_ where rol0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 3
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 4
DEBUG: org.hibernate.SQL - select permiso0_._id as column1_0_0_,
permiso0_.descripcion as descripc2_0_0_, permiso0_.fechaCreacion as
fechaCre3_0_0_, permiso0_.fechaModificacion as fechaMod4_0_0_,
permiso0_.fechaSincronizacion as fechaSin5_0_0_, permiso0_.nombre as
nombre6_0_0_, permiso0_.status as status7_0_0_ from permiso permiso0_
where permiso0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 10
DEBUG: org.hibernate.SQL - select rol0_._id as column1_2_0_,
rol0_.descripcion as descripc2_2_0_, rol0_.fechaCreacion as
fechaCre3_2_0_, rol0_.fechaModificacion as fechaMod4_2_0_,
rol0_.fechaSincronizacion as fechaSin5_2_0_, rol0_.nombre as nombre6_2_0_,
rol0_.status as status7_2_0_ from rol rol0_ where rol0_._id=?
TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter
[1] as [VARCHAR] - 4
For each rol I get extra queries. I still dont get how hibernate works.
How can I avoid this??

No comments:

Post a Comment