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 ?