O problema é que depois de remover a tupla, esse findGroupsByUserId me retorna dados inconsistentes. Tipo, retorna um grupo ao qual o usuário não mais pertence.
Aqui está o método que remove o userGroup:
public void remove(AdmUserGroup object) throws Exception {
try {
Transaction tx;
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
session.delete(object);
tx.commit();
HibernateUtil.closeSession();
} catch (HibernateException he) {
throw new Exception("AdmUserGroupDAO.remove.Exception." + he.getMessage());
}
}
Aqui está o método que me retorna a lista de todos os grupos aos quais o usuário não pertence:
/**
* disabled - 'true' caso queira que sejam retornados apenas os grupos desabilitados
* belongs - 'true' caso queira os grupos a que o usuário pertence
* */
public List findGroupsByUserId(Integer idUser, boolean disabled,boolean belongs){
List list = null;
try{
String strQuery = "";
String arg = (disabled==true)?"\"s\"":"\"n\"";
Session session = HibernateUtil.currentSession();
if(session.isDirty()) session.flush();
if(belongs == true){ /* todos os grupos válidos aos quais o usuário pertence */
strQuery =
"select aug.idUserGroup.idGroup " +
" from AdmUserGroup as aug "+
" where aug.idUserGroup.idUser.idUser = :id ";
list = session.createQuery(strQuery).setInteger("id",idUser.intValue()).list();
} else {
//todos os grupos
List allGroups = session.createQuery("from AdmGroup ag").list();
//todos os grupos do usuário
List userGroups = session.createQuery(
"select aug.idUserGroup.idGroup " +
" from AdmUserGroup aug"+
" where aug.idUserGroup.idUser.idUser = :id").setInteger("id",idUser.intValue()).list();
List idsAllGroups = new ArrayList(); // lista com os ids de todos os grupos
List idsUserGroups = new ArrayList(); // lista com os ids de todos os grupos do usuário
for(int i=0;i<allGroups.size();i++){
idsAllGroups.add( ((AdmGroup)allGroups.get(i)).getIdGroup() );
}
for(int i=0;i<userGroups.size();i++){
idsUserGroups.add( ((AdmGroup)userGroups.get(i)).getIdGroup() );
}
List resposta = new ArrayList();
for(int i=0;i<idsAllGroups.size();i++){
if(!idsUserGroups.contains(idsAllGroups.get(i)) ){
resposta.add( allGroups.get(i) );
}
}
list=resposta;
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
Aqui está o mapeamento do grupo:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="br.com.unilet.consulte.business.to.AdmGroup" table="ADM_GROUP" >
<id name="idGroup">
<column name="IDGROUP" not-null="true"/>
<generator class="increment"/>
</id>
<property name="name" column="NAME" type="string" />
<property name="disableRecord" column="DISABLERECORD" type="string" />
</class>
</hibernate-mapping>
Aqui está o mapeamento do Usuário:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="br.com.unilet.consulte.business.to.AdmUser" table="ADM_USER" >
<id name="idUser">
<column name="IDUSER" not-null="true"/>
<generator class="increment"/>
</id>
<property name="name" column="NAME" type="string"/>
<property name="login" column="LOGIN" type="string"/>
<property name="password" column="PASSWORD" type="string"/>
<property name="email" column="EMAIL" type="string"/>
<property name="description" column="DESCRIPTION" type="string"/>
<property name="disableRecord" column="DISABLERECORD" type="string"/>
</class>
</hibernate-mapping>
Aqui está o mapeamento do relacionamento m:n:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="br.com.unilet.consulte.business.to.AdmUserGroup" table="ADM_USER_GROUP">
<composite-id name="idUserGroup" class="br.com.unilet.consulte.business.to.AdmUserGroupId">
<key-many-to-one name="idUser" class="br.com.unilet.consulte.business.to.AdmUser" column="IDUSER"/>
<key-many-to-one name="idGroup" class="br.com.unilet.consulte.business.to.AdmGroup" column="IDGROUP"/>
</composite-id>
</class>
</hibernate-mapping>