NullPointerException dentro do Hibernate.. Mapeamento com XML

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…

acho que encontrei o problema, o mapeamento tá certo, o erro era na hora de alterar no banco, ao invés de chamar o método saveOrUpdate o método que persiste tava chamando o merge, por esse motivo ele não inseria em cascata…

agora tá acontecendo outro problema, a entidade Relatorio tem uma outra lista de RelatorioSugestao, que também tem uma PK composta, no momento da alteração do Relatorio ele ta tentando inserir as entidades da lista novamente, e ocorre o erro abaixo:

15:42:59,487 ERROR [STDERR] org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

a classe que representa a PK da entidade RelatorioSugestao está com os métodos equals e hashCode implementados, e no momento de alterar eu pego o objeto Relatorio do banco, dou um clear na lista de RelatorioSugestao e adiciono as mesmas entidades que já estavam persistidas… eu sempre fiz assim e o hibernate só inseriu o q era novo e deletou o q não existia mais na lista… só q dessa vez ele tá tentando inserir tdo de novo… segue o código onde populo a lista:

		relatorioPersistent.getRelatorioSugestoes().clear();
		for (RelatorioSugestao relatorioSugestao : relatorio.getRelatorioSugestoes()) {
			relatorioSugestao.getRelatorioSugestaoPK().setRelatorio(relatorioPersistent);
			relatorioPersistent.getRelatorioSugestoes().add(relatorioSugestao);
		}