Problemas ao updatar Collections - Hibernate  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
Pablo_Eteg
JavaBaby
[Avatar]

Membro desde: 10/12/2007 14:42:02
Mensagens: 89
Localização: MG
Offline

Pessoal tenho o seguinte problema quando tento persistir no banco de dados uma Collection, no caso um List.

O Hibernate tenta executar a seguinte query:
update sf2_dispensaprescricaoitem set dispensaprescricao_id=null where dispensaprescricao_id=? and id=?

como o campo dispensaprescricao_id é not null recebo o erro de violação de contraints.

Tenho um objeto original que possui um list como propriedade eu altero os valores do seu List e tento aplicar
o saveOrUpdate ao objeto.

Antes da gravar o objeto no banco seto em todos os objetos do list a propriedade que corresponde ao campo dispensaprescricao_id


e mesmo assim recebo o erro de excessão
java.sql.BatchUpdateException: Column 'dispensaprescricao_id' cannot be null

Estou fazendo algo errado ao gravar no banco?


"Write once, run anywhere!!!" - Java
Pablo Henrique - Desenvolvedor
[Email] [MSN]
andrefariagomes
JavaBaby
[Avatar]

Membro desde: 18/09/2004 11:10:06
Mensagens: 90
Offline

Oi Pablo,

Me parace que você está esquecendo de associar o "detail" ao "master", algo como:
dispensaPrescricaoItem.setDispensaPrescricao(dispensaPrescricao);

Certo?

Abraço,
André Faria
[Email] [WWW] [Yahoo!] [MSN]
Pablo_Eteg
JavaBaby
[Avatar]

Membro desde: 10/12/2007 14:42:02
Mensagens: 89
Localização: MG
Offline

andrefariagomes wrote:Oi Pablo,

Me parace que você está esquecendo de associar o "detail" ao "master", algo como:
dispensaPrescricaoItem.setDispensaPrescricao(dispensaPrescricao);

Certo?


Na verdade é isto o que estou fazendo no for antes do saveOrUpdate mas mesmo assim
o erro persiste.

"Write once, run anywhere!!!" - Java
Pablo Henrique - Desenvolvedor
[Email] [MSN]
andrefariagomes
JavaBaby
[Avatar]

Membro desde: 18/09/2004 11:10:06
Mensagens: 90
Offline

Então talvez você não tenha associado uma sequence ao DispensaPrescricao...
e banco de dados está tentando gravar null na PrimaryKey o que gera a violção.

É um objeto novo, ou você alterando?
Está salvado o pai antes do filho? quero dizer o DispensaPrescricao antes do DispensaPrescricaoItem?
Se não pode tentar usar @Cascade

Algo como:
@Entity
@SequenceGenerator(name = "SEQUENCIA_PESSOA", sequenceName = "SEQUENCIA_PESSOA")
@Table(name = "PESSOA")
public class Pessoa implements Serializable {
@Id
@GeneratedValue(generator = "SEQUENCIA_PESSOA")
@Column(name = "PESSOA_KEY")
public Integer getPessoaKey() {
return pessoaKey;
}
}

This message was edited 2 times. Last update was at 24/05/2008 16:43:52


Abraço,
André Faria
[Email] [WWW] [Yahoo!] [MSN]
Pablo_Eteg
JavaBaby
[Avatar]

Membro desde: 10/12/2007 14:42:02
Mensagens: 89
Localização: MG
Offline

andrefariagomes wrote:Então talvez você não tenha associado uma sequence ao DispensaPrescricao...
e banco de dados está tentando gravar null na PrimaryKey o que gera a violção.

É um objeto novo, ou você alterando?
Está salvado o pai antes do filho? quero dizer o DispensaPrescricao antes do DispensaPrescricaoItem?
Se não pode tentar usar @Cascade

Algo como:
@Entity
@SequenceGenerator(name = "SEQUENCIA_PESSOA", sequenceName = "SEQUENCIA_PESSOA")
@Table(name = "PESSOA")
public class Pessoa implements Serializable {
@Id
@GeneratedValue(generator = "SEQUENCIA_PESSOA")
@Column(name = "PESSOA_KEY")
public Integer getPessoaKey() {
return pessoaKey;
}
}



Você pode me explicar melhor esse Sequence, para o que necessariamente ele serve?

O meu mapeamento na classe pai é o seguinte:


e o da classe filha eh este:



"Write once, run anywhere!!!" - Java
Pablo Henrique - Desenvolvedor
[Email] [MSN]
andrefariagomes
JavaBaby
[Avatar]

Membro desde: 18/09/2004 11:10:06
Mensagens: 90
Offline

Sequences são usadas por alguns banco de dados como o oracle, por exemplo, para armazenar números, geralmente são utilizadas para gerar valores de primary keys, no seu caso, pelo que vi no seu mapeamento está gerando uma abordagem IDENTITY, então não precisa declarar mesmo a sequence.

No exemplo que postei a cima, cada vez que incluo uma registro na tabela PESSOA, a sequence é invocada, e o valor de retorno é associado à chave primaria do novo registro e o valor da sequence é incrementado para que na próxima vez que for envocada o valor seja diferente.

Derrepende vale a pena verificar se o banco de dados que você está usando suporta esse tipo de Generator.
Você tem certeza que valor de dispensaPrescricao.getId() que você associou ao dispensaPrescricaoItem não está nulo?


Abraço,
André Faria
[Email] [WWW] [Yahoo!] [MSN]
Pablo_Eteg
JavaBaby
[Avatar]

Membro desde: 10/12/2007 14:42:02
Mensagens: 89
Localização: MG
Offline

Consegui resolver.

O problema era que na minha página eu copiava o arrayList
alterava seu dados e depois dava um addAll na lista que eu ia
gravar no banco.

Parei de fazer o addAll e atribuí valor por valor em um loop
no objeto que ia ser persistido no banco aih funcionou.

Acho que ao dar addAll o hibernate não conseguia associar a minha lista com o banco de Dados.

Vlw pela ajuda Andre

"Write once, run anywhere!!!" - Java
Pablo Henrique - Desenvolvedor
[Email] [MSN]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team