Invalid Column Name

Pessoal, quando eu salvo um objeto no banco ele salva corretamente mas da segunda vez que vou salva-lo o objeto ja tem um ID e então e gerado esse erro pra mim…pq sera?

Caused by: org.hibernate.exception.SQLGrammarException: could not load an entity: [br.gov.cvm.tpc.ejb.entity.AssuntoProcessoPas#3] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.loader.Loader.loadEntity(Loader.java:1874) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42) at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395) at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:815) at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:229) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120) at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:687) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:669) at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296) at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) at org.hibernate.engine.Cascade.cascade(Cascade.java:130) at org.hibernate.event.def.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:407) at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:266) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120) at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:687) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:669) at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296) at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) at org.hibernate.engine.Cascade.cascade(Cascade.java:130) at org.hibernate.event.def.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:407) at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:266) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53) at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665) at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:227) ... 85 more Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'CD_ASSUNTO_PROCESSO_PAS'. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1458) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4016) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1414) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:176) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:151) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:281) at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:236) at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186) at org.hibernate.loader.Loader.getResultSet(Loader.java:1787) at org.hibernate.loader.Loader.doQuery(Loader.java:674) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) at org.hibernate.loader.Loader.loadEntity(Loader.java:1860) ... 130 more

Essa coluna que esta invalida segundo o eclipse existe mapeada na minha entidade e tem o campo no BD.

Poste seus métodos de inserção/atualização.

é o mesmo jows…

[code]
@Override
public Registro alterarRegistro(Registro registro)
{
//try {

		return dao.getTPCDAO().atualiza(registro);
	
	///}catch (TPCException e) {
	//		throw e;
	//}catch (Exception e) {
	//		throw new EJBException(TPCMessages.getInstance()
	//				.getString("erro_alterarEntidade"));
	//}
}[/code]

Então Everton, tenta analisar esses pontos:

1º) Olha na tabela do banco de dados se existe a coluna CD_ASSUNTO_PROCESSO_PAS;
2º) Olha na sua Entity, se o atributo que representa a coluna esta anotado com @Column indicando o nome da coluna do banco de dados;

Caso nada disso funcione, manda o Hibernate exibir o SQL gerado, para verificar se a coluna esta na instrução SQL.

Até mais.

Tipo você tem que ver se está gerando uma nova entidade para poder zera-la, depois que a entidade é salvada ele dever ser “obrigatóriamente” limpa!
exemplo Pessoa entidade = new Pessoa();
ou você pode criar um metodo para limpar que é o mas utilizado, espero ter ajudado.

O que eu acho mais estranho é ele salvar uma vez mesmo dando mensagem de coluna invalida.

Como já falaram, veja se CD_ASSUNTO_PROCESSO_PAS existe na tabela e se sua classe aponta para alguma coluna desse nome.

Então o que eu acho estranho é exatamente isso jakefrog, se nao tivesse essa coluna na minha tabela e nem um atributo meu anotado para esse campo eu nao conseguiria salvar a primeira vez =/

Veja:

[code]@Entity
@Table(name=“TPC_ASSUNTO_PROCESSO_PAS”)
@NamedQueries({@NamedQuery(name=“findAssuntoProcessoPasByAssuntoProcesso”, query=“from AssuntoProcessoPas ap where ap.nrProc = ?1 and ap.nrAno = ?2 and ap.sgUf = ?3 and ap.assunto.cdAssunto = ?4”),
@NamedQuery(name=“findImpedimentosByAssuntoProcessoPas”, query=“from AssuntoProcessoPas ap left join fetch ap.listaImpedimentos where ap.nrProc = ?1 and ap.nrAno = ?2 and ap.sgUf = ?3 and ap.assunto.cdAssunto = ?4”)})

public class AssuntoProcessoPas implements Serializable {

private static final long serialVersionUID = 1L;
public static final String QUERY_CONSULTA_ASSUNTO_PROCESSO_PAS = "findAssuntoProcessoPasByAssuntoProcesso";
public static final String QUERY_CONSULTA_IMPEDIMENTOS_ASSUNTO_PROCESSO_PAS = "findImpedimentosByAssuntoProcessoPas";

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CD_ASSUNTO_PROCESSO_PAS", unique=true)
private Integer CdAssuntoProcessoPas;[/code]

Postei apenas um pedaço até onde tem o atributo
Olha a imagem do Banco por favor.

Oq o método atualiza(registro) faz?

isso aqui:

[code]public T atualiza(T entity, boolean executarFlush) {
//try {
getEntityManager().merge(entity);

		if(executarFlush){
			getEntityManager().flush();
		}
		
	//} catch (EntityExistsException ex) {
	//	throw new EntidadeJaExisteException(ex);
	//} catch (RuntimeException re) {
	//	throw new GenericDaoException(re);
	//}
	return entity;
}[/code]

obs: esse executar flush é sempre true.

Vc está utilizando o MERGE tanto para Inserir como para atualizar?

Após vc inserir no DB ele está gerando o ID corretamente?

Estou usando o merge, sempre funcionou rs…

Ele gera um id sim na hora de salvar d novo eu olho o id esta la

[quote=evertonsilvagomesjava]Estou usando o merge, sempre funcionou rs…

Ele gera um id sim na hora de salvar d novo eu olho o id esta la[/quote]
Sim sim, ele funciona. Era só para saber mesmo. =P

Cara, quem ta gerenciando a transação? É você na unha ou o servidor?

Pq ta muito bizarro isso.

[quote=jakefrog][quote=evertonsilvagomesjava]Estou usando o merge, sempre funcionou rs…

Ele gera um id sim na hora de salvar d novo eu olho o id esta la[/quote]
Sim sim, ele funciona. Era só para saber mesmo. =P

Cara, quem ta gerenciando a transação? É você na unha ou o servidor?

Pq ta muito bizarro isso.[/quote]

EJB que gerencia as transações, eu tb nem sei o que fazer mais jake =[

Boa tarde, o erro tá muito estranho mesmo. O Invalid Column deveria ocorrer em todos os casos né …

Enfim, eu testaria o seguinte.

troca isso:

private Integer CdAssuntoProcessoPas;

por isso:

private int CdAssuntoProcessoPas;

quem sabe né … xD

[]'s

Outra coisa que você pode fazer, caso a troca para int não funcione, você poderia fazer um drop da tabela e depois deixar que o JPA crie e tabela para fazer.

Outra coisa é que uma vez que o campo é seu ID vc não precisa do unique=true.