O que significa? detached entity passed to persist

quando executo o save() o org.hibernate.PersistentObjectException: detached entity passed to persist: jpa.ServiceOrder é exibido, pq será?

[code]@Entity
public class ServiceOrder {

@Id
@GeneratedValue		
private Integer id;
   
@ManyToOne
@JoinColumn (name="customer_id")
@Cascade (CascadeType.SAVE_UPDATE)
private Customer customer;


@OneToMany(mappedBy = "serviceOrder")
@JoinColumn(name="serviceorder_id")
@Cascade (CascadeType.SAVE_UPDATE) 
private List<ServiceOrderDevice> devices;[/code]

código do método save()

public void save(T t) { entityManager.persist(t); }

action q salva

[code] public String save() {
serviceOrder.setDevices(serviceOrderDevices);
serviceOrderDAO.save(serviceOrder);
return “success”;

}[/code]

Oi,

Se não me falha a memória detached (neste caso) significa objeto desacoplado do contexto de persistencia.

Eu acho que ocorreu o seguinte com o objeto da classe ServiceOrder:

Você pegou o objeto em uma transação/sessão, depois a transação/sessão foi terminada e o objeto passou a ser detached em seguida foram feitas algumas mudanças nos atributos do objeto e vc tentou salvar as alterações deste objeto em uma outra transação/sessão.

Verifique a estratégia de MERGE para objetos detached ou faça uma revisão nos algoritimos envolvidos na atualização do objeto para ver se dá para utilizar a mesma transação/sessão que ele foi consultado na atualização.

Espero não ter confundido mais ainda rsrsrsr.

[]'s

segui alguns exemplos que encontrei na net e o que fiz aparentemente está igual aos demais…

alguma sugestão em termos de código?

:wink:

o que está acontecendo agora é que preencho todo o formulário e clico em salvar só que não salva nada no BD e nem da erro?

Acabo de ter este problema, vim até aqui atrás de solução mas olhando com mais calma caiu ficha… faltava adicionar um controle de transação ao método. Tenta fazer isto no teu método…no meu caso resolveu.

Preciso ter alguma biblioteca extra para usar a anotação citada sobre o método?

cara, o @Transactional vem do Spring…

é um ótimo framework

vc esta mandando persistir uam entidade que esta com o id preenchido!
a anotacao diz que sera auto-incrementado.

3 curtidas

Isso já aconteceu comigo, eu tinha colocado a anotação “cascade = CascadeType.ALL” quando não precisava colocar, pois, eu estava fazendo apenas um relacionamento e ele estava tentando inserir no banco novamente a entidade relacionada.

1 curtida

[quote=ivansalvadori]vc esta mandando persistir uam entidade que esta com o id preenchido!
a anotacao diz que sera auto-incrementado.[/quote]

Cara me ajudou muito, também estava com o mesmo problema Valeu!!!

1 curtida

Ola pessoal eu tbm estou com o mesmo erro e foi depois que coloquei a anotation cascade=CascadeType.ALL, mas no meu caso e eu não estou usando o spring, e sim o vraptor então não tenho essa opção de anotação a Transaction que o amigo acima colocou, alguem tem alguma ideia ai??

vlw

Boa me ajudou muito, realmente foi só retirar o cascade…

[quote=fantomas]Oi,

Se não me falha a memória detached (neste caso) significa objeto desacoplado do contexto de persistencia.

Eu acho que ocorreu o seguinte com o objeto da classe ServiceOrder:

Você pegou o objeto em uma transação/sessão, depois a transação/sessão foi terminada e o objeto passou a ser detached em seguida foram feitas algumas mudanças nos atributos do objeto e vc tentou salvar as alterações deste objeto em uma outra transação/sessão.

Verifique a estratégia de MERGE para objetos detached ou faça uma revisão nos algoritimos envolvidos na atualização do objeto para ver se dá para utilizar a mesma transação/sessão que ele foi consultado na atualização.

Espero não ter confundido mais ainda rsrsrsr.

[]'s

[/quote]

Meu problema era com as transações.
Ao salvar (persist/merge) cada objeto, no método save eu chamava uma nova transação, e ao salvar em cascata eu tinha vários problemas, pois eu utilizava:

Retirei e o sistema funcionou perfeitamente…
:slight_smile:

Isso também resolveu meu problema, quando é uma entidade ManyToMany nao precisa colocar o cascade

Exatamente isso!

Muito obrigado pela explicação Ivan.

Exatamente isso. Simples e objetivo.

O @Transactional funcionou!
Muito bom!