Boa noite pessoal, tudo bem ?
Estou fazendo um mapeamento usando hibernate com a seguinte relação.
@Table(name="tratamento")
public class Tratamento extends Entidade{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch=FetchType.LAZY, cascade = CascadeType.MERGE)
@ForeignKey(name="FK_TRATAMENTO_FUNCIONARIO")
private Funcionario funcionario;
}
A Outra tabela é :
@Table(name="funcionario")
public class Funcionario extends Entidade{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL, optional=false)
@ForeignKey(name="FK_FUNCIONARIO_PESSOA")
private Pessoa pessoa;
Quando eu mandou exluir um TRATAMENTO elança a seguinte exception :
Cannot delete or update a parent row: a foreign key constraint fails (demo
.dia
, CONSTRAINT FK_DIA_FUNCIONARIO
FOREIGN KEY (funcionario_id
) REFERENCES funcionario
(id
))
2013-04-01 22:01:27 ERROR [http-bio-8080-exec-10] (AbstractFlushingEventListener.java:324) - Could not synchronize database state with session
Pelo visto ele está tentando excluir o FUNCIONÁRIO… como resolver isso ?
[quote=joaquimbarros]Cannot delete or update a parent row: a foreign key constraint fails (demo
.dia
, CONSTRAINT FK_DIA_FUNCIONARIO
FOREIGN KEY (funcionario_id
) REFERENCES funcionario
(id
))
2013-04-01 22:01:27 ERROR [http-bio-8080-exec-10] (AbstractFlushingEventListener.java:324) - Could not synchronize database state with session
Pelo visto ele está tentando excluir o FUNCIONÁRIO… como resolver isso ?[/quote]Como você chegou a essa conclusão?
Pelo que parece, alguem aí tem chave com outra pessoa. Ao tenta excluir o banco de dados vai falar que um registro está dependendo do outro…
Certo… Existe sim uma relação de funcionário com outra tabela, mas nesse caso ai, eu só precisaria excluir a referência da tabela TRATAMENTO.
O mapeamento está errado?
[quote=joaquimbarros]Certo… Existe sim uma relação de funcionário com outra tabela, mas nesse caso ai, eu só precisaria excluir a referência da tabela TRATAMENTO.
O mapeamento está errado?
[/quote]Sim. Marque uma classe como classe dependente. Caso o relacionamento seja bidirecional é necessário remover os relacionamentos pelo Java.
a.setB(null);
b.setA(null);
remove(b);
Esse post te ajudará: http://uaihebert.com/?p=1596
Mesmo fazendo isso não resolve… continua dando o mesmo erro. Como se ele estivesse com um cascade all.
verifique se existe funcionario X na classe Tratamento, possivelmente para voce remover esse funcionario, precisara remove-lo tambem da tabela tratamento.
O que eu to querendo fazer é remover somente o TRATAMENTO e não o registro da tabela FUNCIONARIO.
Inclusive eu já setei null no campo funcionario_id, mas mesmo assim ele continua pegando a referencia.
Galera … Resolvido … O problema não estava nessa classe, e sim numa outra classe que estava associada a Funcionário e estava como cascadeAll.
Obrigado a todos que ajudaram…
Abrços