Hibernate - como não atualizar, remover ou inserir dinamicamente

3 respostas
jsign

Pessoal,
Estou trabalhando sobre uma base de dados de um erp e de forma alguma posso remover uma linha/registro sequer deste.
O que ocorre é que o hibernate automaticamente está relacionando os objetos orfãos e, pelo menos, no console os exclui.
Gostaria de saber se esta exclusão é da sessão do hibernate ou da base de dados, se for a segunda opção, existe alguma anotação para que ele não remova orfãos/ou qualquer registro da base?

Não posso deixar ele atualizar, remover ou inserir qualquer coisa dinamicamente.

DEBUG ["http-bio-8080"-exec-4] (AbstractEntityPersister.java:2767) -  Insert 0: insert into ....
DEBUG ["http-bio-8080"-exec-4] (AbstractEntityPersister.java:2768) -  Update 0: update ....
DEBUG ["http-bio-8080"-exec-4] (AbstractEntityPersister.java:2769) -  Delete 0: delete from ....

[]s
Jsign

3 Respostas

jsign

Boas, ninguem sabe como impedir essa situação no hibernate?

Aproveitando o mesmo tópico, embora os assuntos sejam um pouco diferentes, como posso fazer para apontar a referencia de relacionamento para cada atributo em um mapeamento composto ?

O relacionamento abaixo executa um sql errado.

// relation
@ManyToOne
	@JoinColumns({
		@JoinColumn(name="cod_grupo_pc", unique = false, nullable = false,  insertable = false, updatable = false),  
		@JoinColumn(name="cod_contabil", unique = false, nullable = false,  insertable = false, updatable = false)
	})
	private ContaContabil contaContabil;

.....


// sql:

select ..., ... 
     from
        NBS.PLANO_CONTAS this_,
        NBS.CENTRO_CUSTO centrocust2_,
        NBS.CONTA_CONTABIL contaconta3_ 
    where
        this_.cod_centro_custo=centrocust2_.cod_centro_custo 
        and this_.cod_grupo_pc=centrocust2_.cod_grupo_pc 
         and this_.cod_grupo_pc=contaconta3_.cod_contabil 
        and this_.cod_contabil=contaconta3_.cod_grupo_pc

O erro ocorre aqui:

and this_.cod_grupo_pc=contaconta3_.cod_contabil 
        and this_.cod_contabil=contaconta3_.cod_grupo_pc

ou seja: ( cod_grupo_pc = cod_contabil ) nunca vai dar certo.
Consegui corrigir alterando a ordem das colunas no @joinCollumns.

@ManyToOne
	@JoinColumns({
		@JoinColumn(name="cod_contabil", unique = false, nullable = false,  insertable = false, updatable = false),  
		@JoinColumn(name="cod_grupo_pc", unique = false, nullable = false,  insertable = false, updatable = false)
	})
	private ContaContabil contaContabil;

Acredito que apenas a ordem seja um parametro fraco demais, passivel de erro, e teria de acompanhar cada sql novo.
Haveria um outro parametro, não sei se o @JoinCollumn, alguem já passou por isso ?

wolmirGarbin

Opa td certo!

Cara assim eu nunca sobre sua segunda pergunta…
Assim eu nunca utilizei @JoinColumns em um relacionamento @ManyToOne.
faço sempre dessa maneira:

@ManyToOne( fetch = FetchType.LAZY )  //lazy indica q será carregado apenas quando for "utilizar" estes dados.
@JoinColumn( name = "UF", nullable = false ) 
private Uf uf;

pois foi a indicação de um livro que li sobre o assunto.

o @joinColumns eu utilizo para criar chaves primarias compostas assim:

@EmbeddedId
	@AttributeOverrides( {
			@AttributeOverride(name = "userid", column = @Column(name = "USERID", nullable = false, length = 20)),
			@AttributeOverride(name = "dtentrada", column = @Column(name = "DTENTRADA", nullable = false, length = 19))
        })
private LoggerId id;

Classe LoggerId:

@Embeddable
public class LoggerId implements java.io.Serializable { //nesta classe não ha a necessidade de implementar Serializable.

        //Id composto
	@Column(name = "USERID", nullable = false, length = 20)
	private String userid;
	@Column(name = "DTENTRADA", nullable = false, length = 19)
	private Date dtentrada;

...

Espero ter ajudado valeu…

jsign

Obrigado wolmirGarbin, mas, no caso você está se referindo apenas a ‘como criar chaves compostas’, o que eu preciso é conseguir entidades que possuam chaves compostas de uma maneira mais lógica, ou seja, não usando a ordem dos atributos como parametro.

Reseumidamente:

Tenho uma classe carro relacionada a N rodas.

Class Roda

@JoinS{
 @Join( chave=cod_parafuso ), // chave 1
 @Join( chave=cod_pneu ) // chave 2
}
private Carro carro

A ordem do cod_parafuso, cod_pneu no meu relacionamento interfere no HQL, entende?

Se a ordem estiver errada, e não tem como saber se está, o hibernate relaciona errado. Supondo que a ordem esteja errada o hql ficaria assim:

from Roda_this, Carro pi where 
_this.cod_parafuso = pi.cod_pneu // isso não pode ocorrer 
and
_this.cod_pneu = pi.cod_parafuso // isso tb não

Imagino que deva existir algum parametro para forçar o relacionamento correto, que não a ordem.
Algo do tipo:

Class Roda

@JoinS{
 @Join( chave=cod_parafuso, chaveOposta=cod_parafuso ), 
 @Join( chave=cod_pneu,  chaveOposta=cod_pneu ) 
}
private Carro carro

Se algem souber como me ajudar, seria muito grato.

Criado 13 de abril de 2011
Ultima resposta 14 de abr. de 2011
Respostas 3
Participantes 2