| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/05/2008 15:16:47
|
Pablo_Eteg
JavaBaby
![[Avatar]](/images/avatar/19373781a09c6f246e7d1ac54932745e.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/05/2008 16:12:47
|
andrefariagomes
JavaBaby
![[Avatar]](/images/avatar/26ff6f4ca1cfca4861eb91876f706746.png)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/05/2008 16:27:59
|
Pablo_Eteg
JavaBaby
![[Avatar]](/images/avatar/19373781a09c6f246e7d1ac54932745e.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/05/2008 16:41:40
|
andrefariagomes
JavaBaby
![[Avatar]](/images/avatar/26ff6f4ca1cfca4861eb91876f706746.png)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/05/2008 16:56:25
|
Pablo_Eteg
JavaBaby
![[Avatar]](/images/avatar/19373781a09c6f246e7d1ac54932745e.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/05/2008 17:07:31
|
andrefariagomes
JavaBaby
![[Avatar]](/images/avatar/26ff6f4ca1cfca4861eb91876f706746.png)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/05/2008 11:35:59
|
Pablo_Eteg
JavaBaby
![[Avatar]](/images/avatar/19373781a09c6f246e7d1ac54932745e.jpg)
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 |
|
|
 |
|
|