Dps de 3 meses funcionando legal, TransientObjectException

tudo bom galera
to em um projeto já tem 3 meses… tava tudo perfeito ateh 5 dias atras… desde então tem sido um inferno :confused:
o motivo do TOE tem sido quando eu faço

// na classe controller
Empresa empresa = new Empresa();
empresa.setRazaoSocial("Razão social");
... // Ajusto os outros dados da empresa.

TipoDeEmpresa tipoDaEmpresa = new TipoDeEmpresa();
tipoDaEmpresa.setId(1); // Ajusto APENAS O ID do tipo da empresa. Funcionava perfeitamente antes.

// Ajusto o TipoDeEmpresa da Empresa.
empresa.setTipoEmpresa(tipoDaEmpresa);




// 	no GenericDAO
@PersistenceContext(name = "EJBPersistenceUnit", unitName = "EJBPersistenceUnit", type = PersistenceContextType.TRANSACTION)
	private EntityManager entityManager;

	@Override
	public Session getSession() {
		return ((HibernateEntityManager) entityManager).getSession();
	}


// no metodo de salvar no genericDAO
final Session session = getSession();
session.saveOrUpdate(empresa);
session.flush();

dai vem

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.projectentitybeans.beans.Empresa.empresaTipo -> br.com.projectentitybeans.beans.EmpresaTipo
	at org.hibernate.engine.CascadingAction$9.noCascade(CascadingAction.java:376)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:163)
	at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
	at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	at br.com.meuprojeto.core.persistence.hibernate.DGenericHibernateDAO.saveOrUpdate(DGenericHibernateDAO.java:79)
	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 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
	at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
	at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126)
	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:195)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240)
	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210)
	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84)
	at $Proxy85.saveOrUpdate(Unknown Source)
	at br.com.projectejb.ejb.imp.EmpresaServiceBean.saveOrUpdate(EmpresaServiceBean.java:26)
	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 org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
	at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
	at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240)
	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210)
	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84)
	at $Proxy224.saveOrUpdate(Unknown Source)
	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.meuprojeto.core.service.user.DGenericDAOService.saveOrUpdate(DGenericDAOService.java:49)
	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.meuprojeto.core.util.DUtilReflection.invoke(DUtilReflection.java:59)
	at br.com.meuprojeto.core.service.user.BlazeDSRemoteDestinationDefault.getService(BlazeDSRemoteDestinationDefault.java:16)
	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 flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418)
	at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)
	at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400)
	at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005)
	at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103)
	at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)
	at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)
	at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)
	at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166)
	at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291)
	at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
	at java.lang.Thread.run(Unknown Source)

// tem mais...

eu fiz algumas modificações nos meus beans que não sei se podem afetar o comportamento do Hibernate
elas foram:

  • adicionar @Version em todos os beans com o tipo Integer
  • NÃO MAIS fazer meus entity beans herdarem de uma classe abstrata qualquer apenas para me prevenir se eu precisar de algo abstrato (retirei o extends EntityBeanAbstrato que eu tinha antes)
  • comecei a usar tipos Boolean e Integer para dados como empresaAtiva, qtdDeProdutos. Antes eu usava só String
    obs: não posso voltar as configurações por exigencia do cliente
 
import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Version;

@Entity
@Table(name = "empresa")
@SequenceGenerator(name = "empresa_id_seq", sequenceName = "empresa_id_seq", initialValue = 1, allocationSize = 1)
public class Empresa implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private EmpresaTipo empresaTipo;
	private Colaborador responsavel; //   o TOE tb acontece para responsavel e contato
	private Colaborador contato;
	private String razaoSocial;
	private String nomeFantasia;
	private String cnpj;
	private String cei;
	private String inscricaoEstadual;
	private String inscricaoMunicipal;
	private String ean;
	private String matriz;
	private String status;
	private String telefone;
	private Integer version;

	public Empresa() {
	}

	public Empresa(EmpresaTipo empresaTipo, Colaborador responsavel,
			Colaborador contato, String razaoSocial, String nomeFantasia,
			String cnpj, String cei, String inscricaoEstadual,
			String inscricaoMunicipal, String ean, String matriz,
			String status, String telefone) {
		this.empresaTipo = empresaTipo;
		this.responsavel = responsavel;
		this.contato = contato;
		this.razaoSocial = razaoSocial;
		this.nomeFantasia = nomeFantasia;
		this.cnpj = cnpj;
		this.cei = cei;
		this.inscricaoEstadual = inscricaoEstadual;
		this.inscricaoMunicipal = inscricaoMunicipal;
		this.ean = ean;
		this.matriz = matriz;
		this.status = status;
		this.telefone = telefone;
	}


	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "empresa_id_seq")
	@Column(name = "ID")
	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}


	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_EMPRESA_TIPO")
	public EmpresaTipo getEmpresaTipo() {
		return empresaTipo;
	}

	public void setEmpresaTipo(EmpresaTipo empresaTipo) {
		this.empresaTipo = empresaTipo;
	}

	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_COLABORADOR_RESPONSAVEL")
	public Colaborador getResponsavel() {
		return this.responsavel;
	}

	public void setResponsavel(Colaborador responsavel) {
		this.responsavel = responsavel;
	}
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_COLABORADOR_CONTATO")
	public Colaborador getContato() {
		return this.contato;
	}

	public void setContato(Colaborador contato) {
		this.contato = contato;
	}

	
	@Column(name = "RAZAO_SOCIAL", length = 100, nullable = false)
	public String getRazaoSocial() {
		return this.razaoSocial;
	}

	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}


	@Column(name = "NOME_FANTASIA", length = 100, nullable = false)
	public String getNomeFantasia() {
		return this.nomeFantasia;
	}

	public void setNomeFantasia(String nomeFantasia) {
		this.nomeFantasia = nomeFantasia;
	}

	@Column(name = "CNPJ", length = 14, nullable = false, unique = true)
	public String getCnpj() {
		return this.cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	@Column(name = "CEI", length = 20)
	public String getCei() {
		return this.cei;
	}

	public void setCei(String cei) {
		this.cei = cei;
	}

	@Column(name = "INSCRICAO_ESTADUAL", length = 20)
	public String getInscricaoEstadual() {
		return this.inscricaoEstadual;
	}

	public void setInscricaoEstadual(String inscricaoEstadual) {
		this.inscricaoEstadual = inscricaoEstadual;
	}

	@Column(name = "INSCRICAO_MUNICIPAL", length = 20)
	public String getInscricaoMunicipal() {
		return this.inscricaoMunicipal;
	}

	public void setInscricaoMunicipal(String inscricaoMunicipal) {
		this.inscricaoMunicipal = inscricaoMunicipal;
	}

	@Column(name = "EAN", length = 20)
	public String getEan() {
		return this.ean;
	}

	public void setEan(String ean) {
		this.ean = ean;
	}

	@Column(name = "MATRIZ", length = 10)
	public String getMatriz() {
		return this.matriz;
	}

	public void setMatriz(String matriz) {
		this.matriz = matriz;
	}

	@Column(name = "STATUS", length = 10)
	public String getStatus() {
		return this.status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	@Column(name = "TELEFONE", length = 10)
	public String getTelefone() {
		return this.telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	@Version
	@Column(name = "VERSION")
	public Integer getVersion() {
		return version;
	}

	public void setVersion(Integer version) {
		this.version = version;
	}


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Empresa other = (Empresa) obj;
		if (this.id == null) {
			if (other.id != null)
				return false;
		} else if (!this.id.equals(other.id))
			return false;
		return true;
	}

}

desde jah vlw

ao invés de

TipoDeEmpresa tipoDaEmpresa = new TipoDeEmpresa();  
tipoDaEmpresa.setId(1); // Ajusto APENAS O ID do tipo da empresa. Funcionava perfeitamente antes.

tente usar o DAO para buscar o TipoDeEmpresa com id = 1 no banco.

eu to quase fazendo isso deadlock
soh q o foda eh q estava funcionando sem eu fazer o select pra buscar o tipoEmpresa… e do nada comecou a dar TOE…
vou dar uma olhada de novo na documentação do hibernate
ao q me lembro o saveOrUpdate aceita do modo q eu estou fazendo… por iso eu to usando ele… mas vo olhar a documentação de novo pra confirmar
jah tentei com o merge tb mas ai a exception eh outra… Property alguma coisa exception (me esqueci do nome exato. mas eh das famosas)

to usando o hibernate 3.3.2.GA com o jboss-4.2.3.GA

Ola Sheppard (jogando Mass Effect?)

Isso deveria funcionar sim, a nao ser que seu ID no TipoEmpresa nao seja mais a chave primaria. Ela ainda é? Qual é a versao exata do hibernate?

Ah, e use o merge() em vez do saveOrUpdate, apesar de nao ser esse o problema nesse caso.

Voce pode buscar no dao fazendo o load (ou getReference na JPA) dessa forma ele vem lazy, e serve para fazer associacoes como esta, em que voce nao quer puxar o objeto, e sim apenas fazer a sua representacao no relacionamento (ai, se esse relacionamento for lazy, havera o update sem select algum).

Paulo

jogando mass effect??? eu VIVI aquele jogo umas 2 semanas seguidas kkk… um classico de IA

qt ao erro… oq me intriga eh isso msm… eh q de acordo com a documentação é para aceitar, e além do aparecimento repentino do TOE
li em algum lugar por ai q o TOE seria um bug do hibernate? serah q isso procede?

qt a classe TipoDeEmpresa ela continua do mesmo jeito… segue o codigo

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name = "tipo_empresa")
@SequenceGenerator(name = "tipo_empresa_id_seq", sequenceName = "tipo_empresa_id_seq", initialValue = 1, allocationSize = 1)
public class TipoDeEmpresa implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private String descricao;
	private String searchFieldDescricao;
	private Integer version;


	public TipoDeEmpresa() {
	}

	public TipoDeEmpresa(String descricao, String searchFieldDescricao) {
		this.descricao = descricao;
		this.searchFieldDescricao = searchFieldDescricao;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tipo_empresa_id_seq")
	@Column(name = "ID")
	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column(name = "DESCRICAO", length = 50, nullable = false, unique = true)
	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@Column(name = "SEARCH_FIELD_DESCRICAO", length = 50, nullable = false)
	public String getSearchFieldDescricao() {
		return searchFieldDescricao;
	}

	public void setSearchFieldDescricao(String searchFieldDescricao) {
		this.searchFieldDescricao = searchFieldDescricao;
	}

	@Version
	@Column(name = "VERSION")
	public Integer getVersion() {
		return version;
	}

	public void setVersion(Integer version) {
		this.version = version;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((this.id == null) ? 0 : this.id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		TipoDeEmpresa other = (TipoDeEmpresa) obj;
		if (this.id == null) {
			if (other.id != null)
				return false;
		} else if (!this.id.equals(other.id))
			return false;
		return true;
	}
}

será que os construtores tem ha ver com isso?
eu sempre faço um construtor vazio e um FULL… mas o full eu NÃO ponho o ID e o campo VERSION
vou testar agora com o merge tb… ver no q dah (acho q eu não tava usando o merge antes pq o merge justamente faz o select no tipodeempresa antes de salvar, e o saveOrUpdate não, estou certo? isso aumenta a performance… como tem muito tempo q construi o genericdao nao lembro o motivo de algumas coisas)