Galera,
to com um problema no mapeamento do hibernate com XML, segue abaixo:
Tenho uma entidade chamada Relatorio, ela tem uma Lista de RelatorioServidor, segue o mapeamento
<bag name="relatorioServidores" table="relatorio_servidor" inverse="false" cascade="all-delete-orphan">
<cache usage="transactional" />
<key column="fk_id_relatorio" />
<one-to-many class="controle.modelo.RelatorioServidor" />
</bag>
na entidade RelatorioServidor eu tenho uma outra lista de RelatorioSugestaoServidor:
<bag name="relatorioSugestoesServidor" table="relatorio_sugestao_servidor" inverse="false" cascade="all-delete-orphan">
<cache usage="transactional" />
<key column="fk_id_relatorio_servidor" />
<one-to-many class="controle.modelo.RelatorioSugestaoServidor" />
</bag>
na entidade RelatorioSugestaoServidor eu tenho uma composite-id com um objeto do tipo RelatorioServidor e um enum do TipoSugestaoServido:
<composite-id name="relatorioSugestaoServidorPK" class="controle.modelo.RelatorioSugestaoServidorPK">
<key-many-to-one name="relatorioServidor" column="fk_id_relatorio_servidor" class="controle.modelo.RelatorioServidor"/>
<key-property name="tipoSugestaoServidor">
<column name="tipo_sugestao"/>
<type name="util.hibernate.DefaultEnumUserType">
<param name="returnedClass">controle.modelo.TipoSugestaoServidor</param>
</type>
</key-property>
</composite-id>
Bom, o problema é o seguinte: eu tenho um Relatório já persistido e vou adicionar um novo RelatorioServidor que por sua vez possui uma lista de RelatorioSugestaoServidor, seto as referências tdo certinho mas ele insiste em dar um NullPointerException em um método dentro do Hibernate, segue a exceção lançada:
14:46:47,489 ERROR [STDERR] java.lang.NullPointerException
14:46:47,490 ERROR [STDERR] at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:112)
14:46:47,490 ERROR [STDERR] at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:120)
14:46:47,490 ERROR [STDERR] at org.hibernate.type.EntityType.getHashCode(EntityType.java:279)
14:46:47,490 ERROR [STDERR] at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:189)
14:46:47,490 ERROR [STDERR] at org.hibernate.cache.CacheKey.<init>(CacheKey.java:45)
14:46:47,490 ERROR [STDERR] at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3344)
14:46:47,490 ERROR [STDERR] at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
14:46:47,490 ERROR [STDERR] at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218)
14:46:47,490 ERROR [STDERR] at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
14:46:47,491 ERROR [STDERR] at org.hibernate.type.EntityType.replace(EntityType.java:253)
14:46:47,491 ERROR [STDERR] at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:485)
14:46:47,491 ERROR [STDERR] at org.hibernate.type.CollectionType.replace(CollectionType.java:552)
14:46:47,491 ERROR [STDERR] at org.hibernate.type.AbstractType.replace(AbstractType.java:153)
14:46:47,491 ERROR [STDERR] at org.hibernate.type.TypeFactory.replaceAssociations(TypeFactory.java:564)
14:46:47,491 ERROR [STDERR] at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:366)
14:46:47,491 ERROR [STDERR] at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:195)
14:46:47,491 ERROR [STDERR] at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:123)
14:46:47,491 ERROR [STDERR] at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:687)
14:46:47,491 ERROR [STDERR] at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:669)
14:46:47,491 ERROR [STDERR] at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245)
14:46:47,491 ERROR [STDERR] at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
14:46:47,491 ERROR [STDERR] at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
14:46:47,491 ERROR [STDERR] at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
14:46:47,491 ERROR [STDERR] at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
14:46:47,491 ERROR [STDERR] at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
14:46:47,492 ERROR [STDERR] at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
14:46:47,492 ERROR [STDERR] at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
14:46:47,492 ERROR [STDERR] at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
14:46:47,492 ERROR [STDERR] at org.hibernate.event.def.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:407)
14:46:47,492 ERROR [STDERR] at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:152)
14:46:47,492 ERROR [STDERR] at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:126)
14:46:47,492 ERROR [STDERR] at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)
14:46:47,492 ERROR [STDERR] at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)
14:46:47,492 ERROR [STDERR] at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)
14:46:47,492 ERROR [STDERR] at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)
Pelo que pude perceber debugando, o Hibernate tá tentando inserir primeiro a instância de RelatorioSugestaoServidor que possui a PK composta, só que um dos campos da PK é a referência para RelatorioServidor que ainda está com o ID null, por esse motivo dá o NullPointerException, agora pq o Hibernate tá tentando inserir os filhos antes do pai eu num sei, acho q o funcionamento deveria ser ao contrário, ele tinha que inserir primeiro o RelatorioServidor e dpois inserir RelatorioSugestaoServidor com a referência do outro objeto já com o ID preenchido. Alguém tem alguma idéia do que pode ser?? O mapeamento está errado?
abraços…