Duvida Hibernate - Deletar filhos sem deletar o pai

0 respostas
Chronus

Fala, galera ! Sou novato no Hibernate e estou tendo algumas dúvidas no relacionamento entre duas tabelas. Tenho uma classe Prédio que possui vários Andares ( @ OneToMany ) e classe Andar que possui apenas um prédio( @ManyToOne ). Ao deletar o prédio, quero que todos os andares sejam deletados, até aí tudo bem… o problema é que como cada andar tem uma referencia ao Prédio, quando quero deletar apenas 1 andar, o Prédio também acaba sendo deletado ! Achei que o erro estava na notação cascade.ALL que estava utilizando na instancia Prédio de Andar, mas ao retirá-la, ocorre a seguinte exceção ao tentar deletar do banco de dados um determinado andar:

Main

Exception in thread "main" javax.persistence.RollbackException: Error while commiting the transaction at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71) at teste.Teste.main(Teste.java:170) Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) ... 1 more Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`imobilizado/predio_andar`, CONSTRAINT `FK32233D1086B0CCAB` FOREIGN KEY (`andares_id`) REFERENCES `andar` (`id`)) at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1666) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1082) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) ... 9 more

Seguem as classes:

Prédio

@Entity public class Predio { @Id @GeneratedValue private Long id; private String nome; @OneToMany ( cascade = CascadeType.ALL ) @IndexColumn( name = "andares", base=1) private List<Andar> andares; @OneToMany ( cascade = CascadeType.ALL ) @IndexColumn( name = "estoqueMaquinas", base=1) private List<Maquina> estoqueMaquinas; }

Andar

@Entity public class Andar { @Id @GeneratedValue private Long id; private Integer numero; @OneToMany ( cascade = CascadeType.ALL ) @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN @IndexColumn( name = "setores", base=1) private List <Setor> setores; @ManyToOne // Colocamos qual notação cascade aqui ? private Predio predio; }

E aproveitando, tenho uma classe Setor que possui uma List de Máquinas ( parecido com o relacionamento entre Prédio e Andares ), porém, ao deletar um setor, quero que as máquinas permaneçam, pois serão movidas para o estoque ( ao contrário dos andares do prédio, que serão excluídos ao excluir o Prédio… ). Mais uma vez acredito que o problema esteja nas notações cascade.

Isso é possível, galera ?

Criado 26 de março de 2010
Respostas 0
Participantes 1