Hibernate - ordem da remoção de itens

6 respostas
rodrigousp

Como eu poderia remover um objeto pai quando seu id é chave estrangeira do seu objeto filho ?

6 Respostas

TedLoprao

é através do cascade na propriedade do pai!

Fallow

rodrigousp

Não cara…
O pai não pode ser apagado primeiro senão vai dar pau de constraint no banco de dados (ai entra na história da chave estrangeira). O que eu gostaria que o hibernate fizesse seria:

  1. apagar todos os filhos depois o pai, ou
  2. apagar os filhos e o pai ao mesmo tempo.

Seria possível !?
Ou, como contornar este problema!?

rodrigousp

Ah… e obrigado pela tentativa TedLoprao.
Vc (ou alguém) tem mais alguma idéia !?

TedLoprao

Mas é só usar a cascade=“all”, por exemplo…

Não esqueça do inverse=“true” tbm!!

Se quiser postar os mapeamentos para dar uma olhada, fica mais fácil, heheh

fallow

rodrigousp

Opa… claro …

net.sf.hibernate.JDBCException: could not delete: [com.db.gma.vo.MensagemVO#8a2336bafe793cac00fe793e58590003]
	at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)
	at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:284)
	at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:244)
	at com.db.gma.util.Persistence_85kpdc_EOImpl_812_WLStub.delete(Unknown Source)
	at com.db.gma.vo.MensagemDaoTest.tearDown(MensagemDaoTest.java:83)
	at junit.framework.TestCase.runBare(TestCase.java:130)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at junit.framework.TestSuite.runTest(TestSuite.java:208)
	at junit.framework.TestSuite.run(TestSuite.java:203)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:392)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:276)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:167)
Caused by: com.db.gma.util.GmaException
	at com.db.gma.util.PersistenceBean.delete(PersistenceBean.java:184)
	at com.db.gma.util.Persistence_85kpdc_EOImpl.delete(Persistence_85kpdc_EOImpl.java:100)
	at com.db.gma.util.Persistence_85kpdc_EOImpl_WLSkel.invoke(Unknown Source)
	at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:477)
	at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerRef.java:108)
	at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:420)
	at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)
	at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)
	at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:415)
	at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)
	at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
	at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
Hibernate: delete from GMA_CONTROLE_FLUXO where ID_CTRL=?
net.sf.hibernate.JDBCException: could not delete: [com.db.gma.vo.MensagemVO#8a2336bafe793cac00fe793e5b090004]
        at net.sf.hibernate.persister.EntityPersister.delete(EntityPersister.java:618)
        at net.sf.hibernate.impl.ScheduledDeletion.execute(ScheduledDeletion.java:29)
        at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2414)
        at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2372)
        at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2236)
        at com.db.gma.util.PersistenceBean.delete(PersistenceBean.java:179)
        at com.db.gma.util.Persistence_85kpdc_EOImpl.delete(Persistence_85kpdc_EOImpl.java:100)
        at com.db.gma.util.Persistence_85kpdc_EOImpl_WLSkel.invoke(Unknown Source)
        at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:477)
        at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerRef.java:108)
        at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:420)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)
        at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:415)
        at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)
Caused by: java.sql.SQLException: ORA-02292: integrity constraint (GMATCS.SYS_C009550) violated - child record found

        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
        at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:579)
        at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1894)
        at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1094)
        at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2132)
        at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2015)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2877)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
        at net.sf.hibernate.impl.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22)
        at net.sf.hibernate.persister.EntityPersister.delete(EntityPersister.java:599)
        ... 16 more
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
    
<hibernate-mapping>
<class  name="com.db.gma.vo.MensagemVO"  table="GMA_CONTROLE_FLUXO"
> 
	<id name="mensagemId" type="java.lang.String" column="ID_CTRL" unsaved-value="null">
		<generator class="uuid.hex"/>	
	</id>

    <property
        name="usuarioAprovacao"
        type="java.lang.String"
        column="LOGIN_USU_APROV"
        length="22"
    />

    <property
        name="codigoSituacao"
        type="java.lang.Integer"
        not-null="true"
        column="COD_SIT"        
  	/>

    <many-to-one
        name="gmaAplicacao"
        class="com.db.gma.vo.GmaAplicacao"
        not-null="true"
        cascade="none"
    >
        <column name="COD_APLIC" />
    </many-to-one>

    <list name="GmaControleFluxoMsgs"   lazy="false"   inverse="true" cascade="all">
        <key>
            <column name="ID_CTRL" />
        </key>
        <index column="SEQ_MSG"/>
        <one-to-many  class="com.db.gma.vo.GmaControleFluxoMsg" />        
    </list>
    
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >    
<hibernate-mapping>
<class 
    name="com.db.gma.vo.GmaControleFluxoMsg" 
    table="GMA_CONTROLE_FLUXO_MSG"
>

    <composite-id name="comp_id" class="com.db.gma.vo.GmaControleFluxoMsgPK" unsaved-value="any">
        <key-property 
            name="seqMsg" 
            type="java.math.BigDecimal"
            column="SEQ_MSG" 
            length="22"
		/>
        <key-many-to-one
        	name="mensagemVO"
	        class="com.db.gma.vo.MensagemVO"
	    >
    	    <column name="ID_CTRL" 
            length="40"
			not-null="true"    	    
    	    />
	    </key-many-to-one>
    </composite-id>    

    <property
        name="msgTxt"
        type="java.lang.String"
        column="MSG_TXT"
        length="4000"
    />
    <property
        name="msgXml"
        type="java.lang.String"
        column="MSG_XML"
        length="4000"
    />

</class>
</hibernate-mapping>
rodrigousp

E ae galera … alguma dica !?

Criado 19 de agosto de 2004
Ultima resposta 23 de ago. de 2004
Respostas 6
Participantes 2