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