Hibernate tah maluco!

4 respostas
italomaia

Tow com o seguinte problema, eu tow removendo uma tupla com o hibernate, aí o hibernate remove ela do banco, mas quando eu faço uma query logo em seguida, ele me retorna essa tupla como se eu não a tivesse deletado. É uma tupla fantasma! @_O E o flush tah rolando solto aqui e nada…O relacionamento tah assim:

many-to-many:
x->y
y-z
aí eu apago y, entretanto o relacionamento x->y->z continua…

4 Respostas

ramilani12

Coloque seu mapeamento para gente analisar

Vc ja tentou excluir uma tupla Z ?

M

Tú está dando commit na transação após remover o registro?

italomaia

Yeap, comitando. Blz, amanhã eu posto aqui a query e o mapeamento(tah no trabalho, sabe).

italomaia

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>
Criado 17 de outubro de 2006
Ultima resposta 18 de out. de 2006
Respostas 4
Participantes 3