Hibernate Many-to_Many, salvar objeto

Bom dia a todos, tenho a seguinte dúvida:

Cliente

@ManyToMany(targetEntity = Endereco.class, cascade = { CascadeType.PERSIST,
			CascadeType.MERGE })
	@JoinTable(name = "exemplosilvio_endereco", joinColumns = { @JoinColumn(name = "id_cliente") }, inverseJoinColumns = { @JoinColumn(name = "id_endereco") })
	private List<Endereco> enderecos;

Endereco

@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "endereco", targetEntity = Cliente.class)
	private List<Cliente> clientes;

Classe de teste: quando executo este teste ele me retorna um erro dizendo que eu devo salvar o endereco antes de salvar o cliente, pois quando incluo um endereço e faço um load e a partir desse load eu seto no cliente ele funciona, porém queria que quando savla-se o cliente ele salva-se os endereços…

public void testSaveClienteComComprasEendereco() {
		Cliente cliente = new Cliente();
		cliente.setNome("Silvio");
		cliente.setCpf(3296896);
		cliente.setDataCadastro(new Date());
		cliente.setDataNascimento(new Date());
		cliente.setEndereco("Guatmosi da silva rossi");
		cliente.setTemporaria(10);
		cliente.setTotalCompras(12.50);

		Endereco endereco1 = new Endereco();
		endereco1.setRua("guatmosi");

		Endereco endereco2 = new Endereco();
		endereco2.setRua("da silva rossi");

		cliente.addEndereco(endereco1);
		cliente.addEndereco(endereco2);
		cliente.addCompraItem(compraItem);

		endereco1.addCliente(cliente);

		Transaction tx = session.beginTransaction();
		session.save(cliente);
		tx.commit();
	}

Assim funciona

	public void testSaveClienteComComprasEendereco() {
		Cliente cliente = new Cliente();
		cliente.setNome("Silvio");
		cliente.setCpf(3296896);
		cliente.setDataCadastro(new Date());
		cliente.setDataNascimento(new Date());
		cliente.setEndereco("Guatmosi da silva rossi");
		cliente.setTemporaria(10);
		cliente.setTotalCompras(12.50);

		CompraItem compraItem = new CompraItem();
		compraItem.setDescricao("balas juquinha");
		compraItem.setQuantidade(10);

		Endereco end = (Endereco) session.load(Endereco.class,
				(Serializable) new Integer(1));

		cliente.addEndereco(end);
		
		Transaction tx = session.beginTransaction();
		session.save(cliente);
		tx.commit();

	}

O erro:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.asm.business.entities.Endereco
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:219)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397)
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:78)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:755)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1143)

[]'s

Use session.save() em ambos os endereços antes de salvar o cliente.

Lipe muito obrigado mesmo… resolveu meu problema…

eu tenho que fazer isso para que o objeto se torne persistente antes de relacionar com outro objeto ??? sempre no many-to-many é assim ?

[editado]
pq em one to many eu nao preciso ???
[/editado]

[]'s

Seu mapeamento precisa de algumas indicações especiais. Exemplo usando xml para configurar aqui:
http://www.java2s.com/Code/Java/Hibernate/ManytoManyMapCascadeSave.htm

Lipe obrigado pela atenção vou ler o conteúdo do link…

[]'s