Amigos,
Estou com o seguinte problema:
- Tenho um cadastro de Pessoas. A inclusão de pessoa funciona sem problemas. O problema acontece a partir daí, qualquer outra "alteração" tenho dificuldade por causa dos campos de Sistema.
@MappedSuperclass
public class Sistema {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(nullable=false)
private Date dataCriacao;
@Column(nullable=false)
private Date dataUltimaAlteracao;
@Version
@Column(nullable=false)
private Long version;
@Column(nullable=false)
private Boolean status;
@Entity
public class Pessoa extends Sistema {
@Column
@NotNull
@NotEmpty
private String nomePessoa;
@Enumerated(value=EnumType.STRING)
@Column
@NotNull
private TipoPessoa tipoPessoa;
@Column
@NotNull
@NotEmpty
private String cpf;
@Enumerated(value=EnumType.STRING)
@NotNull
private Sexo sexo;
@Enumerated(value=EnumType.STRING)
@Column
@NotNull
private EstadoCivil estadoCivil;
@Column
@NotNull
@Past
private Date dataNascimento;
@ManyToOne
@NotNull
private Profissao profissao;
@OneToOne
@NotNull
@Valid
private Endereco endereco;
@OneToMany(mappedBy="pessoa")
private List<Telefone> telefones;
@Column
@Email
private String email;
Eu levo pra tela, apenas o ID da Pessoa. Eu passo pela minha lógica e no momento da gravação eu estou procurando uma forma de atualizar os atributos de sistema em pessoa.
public abstract class SistemaDAO<T> implements SistemaRepository<T>{
/**/
public void update(T t) {
if (t instanceof Sistema) {
refreshSistema(t);
Sistema sistema = (Sistema) t;
sistema.setDataUltimaAlteracao(new Date());
}
session.update(t);
}
@SuppressWarnings("unchecked")
private void refreshSistema(T t) {
try {
T newT = (T) t.getClass().newInstance();
((Sistema) newT).setId(((Sistema) t).getId());
this.refresh(newT);
((Sistema) t).setDataCriacao(((Sistema) newT).getDataCriacao());
((Sistema) t).setDataUltimaAlteracao(((Sistema) newT).getDataUltimaAlteracao());
((Sistema) t).setStatus(((Sistema) newT).getStatus());
((Sistema) t).setVersion(((Sistema) newT).getVersion());
} catch (Exception e) {
e.printStackTrace();
}
}
/**/
}
O erro que ele me gera:
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [br.com.sistema.model.endereco.Endereco#1]
at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:637)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:305)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:57)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:734)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:722)
at org.hibernate.impl.SessionImpl.update(SessionImpl.java:714)
at br.com.sistema.dao.SistemaDAO.update(SistemaDAO.java:46)
at br.com.sistema.controller.PessoaController.adicionar(PessoaController.java:186)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
... 43 more
Agradeço a ajuda desde já :)
