Erro ao remover com Hibernate

5 respostas
MarceloNeo

Erro ao remover com Hibernate um Objeto (Pai) que tem um Set (Filhos) de Objeto.

Gostaria de remover Um Pai e seus filhos… é possivel? … só removendo o Objeto Pai
Remover os filhos do objeto Pai, somente do Set, não no banco, depois dar um Update no objeto pai é possivel?.. e tudo estará ok?

Contextualizando quando mandar atualizar o Pai queria que removesse os Filhos que não estão mais no Set, na verdade seria (tipo) sincronizar
porque estou falando isso, quando vou salvar e inserir novos objetos filhos funciona, porém se removo os objetos filhos, sem remover diretamente da base. e mando atualizar o Pai não remove os Filhos.

Não sei o que eu estou fazendo de errado, já li em vários lugares na Internet, também li que essa não é uma das formas mais recomendada porque?, mas ainda não sei o que existe de errado.
Esse é o erro. quando tento remover o objeto Pai,
Cannot delete or update a parent row: a foreign key constraint fails. Lógico tem uma fk que esta sendo desrespeitada.
Quanto aos filhos não da erro. mas também não remove

É possível fazer dessa forma que estou tentando?
O que há de errado nesse código?
Porque não remove os objetos Filhos quando atualizo o Pai?
Porque não remove o Objeto Pai quando este tem Filhos, se a propriedade cascade=CascadeType.ALL?

Isso diminuiria em muito o meu acesso a base de dados, e também aumentaria minha produtividade!

Aqui esta o código do pai…

public class SysPaper
{
             @OneToMany(mappedBy = "paperId", targetEntity = SysPaperRole.class)
             @Cascade(CascadeType.ALL)
             private Set<SysPaperRole> roleSet;
}

Código filho…

public class SysPaperRole{

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "paperId", referencedColumnName = "id", insertable=true)
    @Cascade(CascadeType.SAVE_UPDATE)
    private SysPaper          paperId;

}

Já li também muitos posts aqui no fórum mesmo, mas até agora nada.
Se alguém puder me da umas dicas desde já meu muito obrigado!

5 Respostas

Guevara

Olá!
Tente assim:

public class SysPaper
{
             @OneToMany(targetEntity=SysPaperRole.class , cascade = CascadeType.ALL, mappedBy = "syspaper", orphanRemoval=true)    
             private Set<SysPaperRole> roleSet;
}

E na outra classe apenas:

public class SysPaperRole{

    @ManyToOne(fetch = FetchType.LAZY)
    private SysPaper paperId;
}

[]s

MarceloNeo

Eu uso,
javax.persistence.OneToMany

não tem essa propridade, orphanRemoval=true.
Terminei alterei para

A principio funcionou certinho.
Fiz os teste de remover Filhos… e da Update no Pai…
esse problema ainda persiste…

Ainda não estou entendo o que esta acontecendo!
Muito obrigado Guevara,

Guevara

Então, o orphanRemoval=true é coisa nova, remove os órfãos automáticamente, se puder, atualize o persistence.xml para usar JPA2.
Este é o pacote:
boolean javax.persistence.OneToMany.orphanRemoval()

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
			 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
			 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>  
        <properties>        	
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/meuprojeto" />
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
            <property name="javax.persistence.jdbc.password" value="123456" />
            <property name="javax.persistence.jdbc.user" value="postgres" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>           
        </properties>
</persistence-unit>
</persistence>

Só alterar os dados pro seu banco.
Tô tentando lembrar o que mais eu fiz aqui pra ter esse parâmetro disponível, acho que o jar do hibernate tb:

hibernate-jpa-2.0-api-1.0.0.Final.jar

Está na pasta do Hibernate, eu uso a versão 3.5.1-final.
[]s

MarceloNeo

Eu uso Hibernate 3.3.1, Annotations 3.4.0.GA, EntityManager 3.4.0.GA. O meu arquivo persistencia já é versão 2.
adicionei o .jar que você sugeriu mas não deu certo, tentei fazer um upgrade do hibernate, mas
não achei Um EntityManager compativel com a versão hibernate-distribution-3.5.6-Final-dist, depois vou ver se encontro
A atualizaçao gerou outros erros.

E com relaçao aquele parametro, ainda vou analizar dinovo.

Guevara

Veja a dica:
http://www.objectdb.com/java/jpa/persistence/delete

Criado 29 de setembro de 2010
Ultima resposta 29 de set. de 2010
Respostas 5
Participantes 2