Collections no Hibernate  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Rodrigo Carvalho Auler
Virtual Machine Man

Membro desde: 14/02/2003 15:59:17
Mensagens: 576
Localização: Rio de Janeiro
Offline

Estou tentando usar o Hibernate. Na hora de fazer a persistência de classes simples tá beleza, mas não estou conseguindo fazer quando tenho uma classe com uma collection:



O mapeamento está assim:



Na primeira vez que tento dar um save com esse objeto, ele dá erro de NullPointerException e depois fica dizendo que a tabela tá lockada.

Alguém tem alguma idéia?

PS: estou usando o MySql 4 e a classe Email está mapeada e funcionando.
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline

Nao tenho certeza sobre o uso de arrays com o mapeamento <set>... nao seria melhor usar um java.util.Set ou uma outra Collection?

Alias, se alguem puder esclarecer isso, eu agradeco
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
maxguzenski
Virtual Machine Man
[Avatar]

Membro desde: 07/03/2003 11:47:42
Mensagens: 549
Localização: Porto Alegre
Offline


o hibernate nao funciona com Arrays, deve-se usar List ou Set

no seu caso, que me parece ser um relacionamento de one-to-many
deve-se usar Set




o relacionamento many-to-many so se usa quando se tem uma tabela intermediaria e vc quer retira-la no mappiamento.
como disse, é one-to-many, pois cada registro (1) aponta para varios (many)



o Set funciona usando codigo hash e metodo equals quando acontecer colisao de codigo hash (interface Set nao aceita elementos repetidos)

aconcelho profundamente, voce redefenir os metodos "public int hashCode()" e "public boolean equals(Object o)"
para maior performace.

Maximiliano Ferreira Guzenski
Sun Certified Java Programmer 1.4
Sun Certified Web Component Developer 1.4
http://www.guzenski.com.br
[Email] [WWW] [MSN]
Rodrigo Carvalho Auler
Virtual Machine Man

Membro desde: 14/02/2003 15:59:17
Mensagens: 576
Localização: Rio de Janeiro
Offline

Eu tentei usar List ou Set e deu o erro:



Mas eu acho que no meu caso é many-to-many sim. Veja a estrutura de tabelas:

ricardolecheta
GUJ Master
[Avatar]

Membro desde: 17/05/2003 13:42:10
Mensagens: 1486
Localização: Curitiba
Offline

Collections are declared by the set, list, map, bag, array and <primitive-array>

http://hibernate.bluemars.net/hib_docs/reference/html/collections.html#collections-s1-3

Ricardo R. Lecheta
Livro - Google Android (português)
http://www.livroandroid.com.br/
http://livroandroid.blogspot.com/
http://www.livetouch.com.br/
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline

maxguzenski wrote:aconcelho profundamente, voce redefenir os metodos "public int hashCode()" e "public boolean equals(Object o)"
para maior performace.


Cuidado com isso... redefinir equals() e hashCode() nao garante ganhos de performance, e pode levar a bugs sérios se vc não souber direito o que tá fazendo, ainda mais quando vc está trabalhando com Sets, que dependem desses métodos pra fazer a classificação dos objetos
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
Rodrigo Carvalho Auler
Virtual Machine Man

Membro desde: 14/02/2003 15:59:17
Mensagens: 576
Localização: Rio de Janeiro
Offline

Eu já tinha tentado com <array>, não tinha visto o <primitive-array>. mas dá erro de java.lang.NullPointerException.

O Mapeamento ficou assim:

ricardolecheta
GUJ Master
[Avatar]

Membro desde: 17/05/2003 13:42:10
Mensagens: 1486
Localização: Curitiba
Offline

java.lang.NullPointerException aonde?

para saber mais sobre as collections veja aqui;
http://www.xylax.net/hibernate/

Ricardo R. Lecheta
Livro - Google Android (português)
http://www.livroandroid.com.br/
http://livroandroid.blogspot.com/
http://www.livetouch.com.br/
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline

primitive-array é só pra arrays de primitivos, como o próprio nome diz... serve apenas para int[], char[], e por aí vai

Mas, afinal, pq usando <array> nao deu certo?
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
Rodrigo Carvalho Auler
Virtual Machine Man

Membro desde: 14/02/2003 15:59:17
Mensagens: 576
Localização: Rio de Janeiro
Offline

O problema do NullPointerException acho que tem a ver com isso que achei no FAQ do Hibernate:

FAQ wrote:
Hibernate throws a NullPointerException when I load or query an object!

If your object has a primitive-type property mapped to a nullable database column then you will need to use a Hibernate custom type to assign a sensible default (primitive) value for the case of a null column value. A better solution is usually to use a wrapper type for the Java property.


Quanto ao erro usando <array>, o erro foi o seguinte:



O mapeamento tá assim:



Mas pra ser sincero, não sei pra que serve essa tag <index column/>, e sem ela dá o erro de java.lang.NullPointerException quando tento abrir a sessão do Hibernate.



O erro completo nesse caso é:



[]'s
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline

O problema aqui é que vc está definindo o id "id" duas vezes - uma no objeto Empresa, e outra no array emails. Use um outro nome (sei lah, emails_id) que esse erro deve sumir
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
Rodrigo Carvalho Auler
Virtual Machine Man

Membro desde: 14/02/2003 15:59:17
Mensagens: 576
Localização: Rio de Janeiro
Offline

Acho que não é isso não: mudei a classe e o mapeamento e continua dando o mesmo erro:



Mas alguém sabe pra serve a tag <index column> ?
maxguzenski
Virtual Machine Man
[Avatar]

Membro desde: 07/03/2003 11:47:42
Mensagens: 549
Localização: Porto Alegre
Offline

cv wrote:
maxguzenski wrote:aconcelho profundamente, voce redefenir os metodos "public int hashCode()" e "public boolean equals(Object o)"
para maior performace.


Cuidado com isso... redefinir equals() e hashCode() nao garante ganhos de performance, e pode levar a bugs sérios se vc não souber direito o que tá fazendo, ainda mais quando vc está trabalhando com Sets, que dependem desses métodos pra fazer a classificação dos objetos


o problema de voce deixar o equals e hashCode da classe Object, é que o hashCode retorna a posicao de memoria, e equals faz um simples " == "

o quer quer dizer, voce nao teste se a classe é equivalentemente iguais, apenas testa se sao a MESMA classe, logo classe com valores iguais vao entrar no Set sem problemas (o que pelo certo, nao devia), e varios metos de comparacao de objetos da classe Set deixam de funcionar.

http://hibernate.bluemars.net/109.html

Maximiliano Ferreira Guzenski
Sun Certified Java Programmer 1.4
Sun Certified Web Component Developer 1.4
http://www.guzenski.com.br
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team