Problema ao tentar inserir um objeto com em.persist()

4 respostas
EuclidesFilizola

Boa tarde caros amigos, estou aqui apanhando um bocado no JPA.

Estou tentando fazer um teste, e não está inserindo.

@Test
	public void testInserirUsuario(){
	
		String login = System.getProperty("user.name");
		
		UsuarioDAO usuarioDAO = new UsuarioDAO();
		UsuarioLocalDAO instance = new UsuarioLocalDAO();
		UsuarioLocal user = new UsuarioLocal();
		Usuario usuario = new Usuario();
		
		usuario = usuarioDAO.buscarUsuario(login);
		
		user = instance.obterUsuario(usuario);
	
		instance.inserirUsuario(user);
		
		
		
	}

aqui está meus métodos:

public Usuario buscarUsuario(String login){
		
	return JPAUtil.getInstance("BDSERV").getEntity(Usuario.class,login);
	}
public UsuarioLocal obterUsuario(Usuario usuario){
		
		usuarioLocal.setNome(usuario.getNome());
		usuarioLocal.setCodigoSetor(1);
		usuarioLocal.setTipoDeUsuario(1);
		usuarioLocal.setId(1);
		
		return usuarioLocal;
		
	}
public void inserirUsuario(UsuarioLocal usuarioLocal){
		EntityManager em = JPAUtil.getInstance("bancoLocal").getEntityManager();
		em.persist(usuarioLocal);
		em.getTransaction().commit();
		em.close();

	}

… dae da o seguinte erro:

javax.persistence.RollbackException: Error while commiting the transaction
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
	at teste.UsuarioLocalDAOTest.testInserirUsuario(UsuarioLocalDAOTest.java:63)
	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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
	at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [entity.UsuarioLocal]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2285)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678)
	at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
	... 25 more
Caused by: java.sql.SQLException: Invalid object name 'teste.tbsisc_usuario'.
	at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
	at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2816)
	at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2254)
	at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:631)
	at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584)
	at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546)
	at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:505)
	at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2265)
	... 36 more

Dae já explico , a tabela teste.tbsisc_usuario existe sim ! …

e tem um detalhe se eu trocar meu teste para o seguinte:

@Test
	public void testInserirUsuario(){
	
		String login = System.getProperty("user.name");
		
		UsuarioDAO usuarioDAO = new UsuarioDAO();
		UsuarioLocalDAO instance = new UsuarioLocalDAO();
		UsuarioLocal user = new UsuarioLocal();
		Usuario usuario = new Usuario();

		user.setCodigoSetor(codigoSetor);
		user.setId(id);
		user.setNome(nome);
		user.setTipoDeUsuario(tipoDeUsuario)

    	        instance.inserirUsuario(user);
		}

Dessa forma a inserção funciona, já da outra não funciona. Gostaria de uma ajuda. Alguém para dar uma força ?

4 Respostas

jyoshiriro

Como está seu persistence.xml ?

Manda também o código da tua classe Usuario.

EuclidesFilizola
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	<persistence-unit name="bancoLocal" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>entity.Grupo</class>
		<class>entity.AndamentoSolicitacao</class>
		<class>entity.Solicitacao</class>
		<class>entity.Estado</class>
		<class>entity.Viagem</class>
		<class>entity.UsuarioLocal</class>
		
		<properties>
			<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
			<property name="hibernate.connection.username" value="postgres" />
			<property name="hibernate.connection.password" value="1234" />
			<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/SISCONTV" />
			<property name="hibernate.show_sql" value="true" /><!--
			<property name="hibernate.format_sql" value="true" />
			--><property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
		</properties>
	</persistence-unit>
	
	<persistence-unit name="BDSERV" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>entity.Usuario</class>
		<properties>
			<property name="hibernate.connection.driver_class" value="net.sourceforge.jtds.jdbc.Driver" />
			<property name="hibernate.connection.username" value="User_SICV" />
			<property name="hibernate.connection.password" value="systemsicv" />
			<property name="hibernate.connection.url" value="jdbc:jtds:sqlserver://172.31.128.25/bdserv;" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		</properties>
	</persistence-unit>
	
	<persistence-unit name="BDINTR" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>entity.Setor</class>
		<properties>
			<property name="hibernate.connection.driver_class" value="net.sourceforge.jtds.jdbc.Driver" />
			<property name="hibernate.connection.username" value="User_SICV" />
			<property name="hibernate.connection.password" value="systemsicv" />
			<property name="hibernate.connection.url" value="jdbc:jtds:sqlserver://172.31.128.25/bdintr;" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		</properties>
	</persistence-unit>
</persistence>

e aqui está minha classe Usuario.

@Entity(name="Usuario")
	@Table(name="[DADOS DO SERVIDOR]")
	public class Usuario implements Serializable {

		
		private static final long serialVersionUID = 1L;
		
		@Id
		@Column(name="Ds_Login")
		private String login;
		
		@Column(name="NOME")
		private String nome;
		
	/*	@Column(name="tipo_usuario")
		private Integer tipoDeUsuario;
		*/
		@Column(name="MATRÍCULA")
		private Integer numDaMatricula;
		
		@Column(name = "[UNIDADE DE EXERCÍCIO]")
		private String setor;
		
	/*	@ManyToMany(targetEntity=Grupo.class,mappedBy="listaUsuarios")
		@JoinTable(name="tbsisc_usuario_grupo")
		private List<Grupo> listGrupos = new LinkedList<Grupo>();
				
		@OneToMany(mappedBy="usuario")
		private List<Solicitacao> listaSolicitacao = new LinkedList<Solicitacao>();
		
	*/	public Usuario() {
			
		}
		
		public Usuario(String login){
			this.login = login;
		}

		public String getLogin() {
			return login;
		}

		public void setLogin(String login) {
			this.login = login;
		}

		public String getNome() {
			return nome;
		}

		public void setNome(String nome) {
			this.nome = nome;
		}

	/*	public Integer getTipoDeUsuario() {
			return tipoDeUsuario;
		}

		public void setTipoDeUsuario(Integer tipoDeUsuario) {
			this.tipoDeUsuario = tipoDeUsuario;
		}
*/
		public Integer getNumDaMatricula() {
			return numDaMatricula;
		}

		public void setNumDaMatricula(Integer numDaMatricula) {
			this.numDaMatricula = numDaMatricula;
		}

		public String getSetor() {
			return setor;
		}

		public void setSetor(String setor) {
			this.setor = setor;
		}

	/*	public List<Grupo> getListGrupos() {
			return listGrupos;
		}

		public void setListGrupos(List<Grupo> listGrupos) {
			this.listGrupos = listGrupos;
		}

		public List<Solicitacao> getListaSolicitacao() {
			return listaSolicitacao;
		}

		public void setListaSolicitacao(List<Solicitacao> listaSolicitacao) {
			this.listaSolicitacao = listaSolicitacao;
		}
*/
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime
					* result
					+ ((numDaMatricula == null) ? 0 : numDaMatricula.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;
			Usuario other = (Usuario) obj;
			if (numDaMatricula == null) {
				if (other.numDaMatricula != null)
					return false;
			} else if (!numDaMatricula.equals(other.numDaMatricula))
				return false;
			return true;
		}
		
		
		

}

E aqui está a UsuarioLocal

@Entity
@Table(name="teste.tbsisc_usuario")
public class UsuarioLocal implements Serializable {
	
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="pktbsisc_usuario")
	private Integer Id;
	
	@Column(name="nm_usuario")
	private String nome;
	
	@Column(name="cd_setor")
	private Integer codigoSetor;
	
	@Column(name="tp_usuario")
	private Integer tipoDeUsuario;
	
	/*@ManyToMany(targetEntity=Grupo.class,mappedBy="listaUsuarios")
	@JoinTable(name="tbsisc_usuario_grupo")
	private List<Grupo> listGrupos = new LinkedList<Grupo>();
			
	@OneToMany(mappedBy="usuario")
	private List<Solicitacao> listaSolicitacao = new LinkedList<Solicitacao>();
	*/
	public UsuarioLocal() {
		
	}

	public Integer getId() {
		return Id;
	}

	public void setId(Integer id) {
		Id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Integer getCodigoSetor() {
		return codigoSetor;
	}

	public void setCodigoSetor(Integer codigoSetor) {
		this.codigoSetor = codigoSetor;

	}

	public Integer getTipoDeUsuario() {
		return tipoDeUsuario;
	}

	public void setTipoDeUsuario(Integer tipoDeUsuario) {
		this.tipoDeUsuario = tipoDeUsuario;
	}

	/*public void setListGrupos(List<Grupo> listGrupos) {
		this.listGrupos = listGrupos;
	}

	public List<Grupo> getListGrupos() {
		return listGrupos;
	}

	public void setListaSolicitacao(List<Solicitacao> listaSolicitacao) {
		this.listaSolicitacao = listaSolicitacao;
	}

	public List<Solicitacao> getListaSolicitacao() {
		return listaSolicitacao;
	}
*/
	
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((Id == null) ? 0 : 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;
		UsuarioLocal other = (UsuarioLocal) obj;
		if (Id == null) {
			if (other.Id != null)
				return false;
		} else if (!Id.equals(other.Id))
			return false;
		return true;
	}

	
	
}

da uma olhada ae. Só explicando, é que eu estou tentando acessar 2 bancos em 2 lugares diferentes, ou seja, em 2 servidores diferentes. Por isso eu Utilizei Usuario e UsuarioLocal. Mas isso é só como teste, porque logo depois eu vou mudar isso dae. Porque ta muito feio. Mas só a título de teste, mesmo assim, não está funcionando.

Obrigado pela atenção.

Andre_Brito

Não li todo o seu post, mas aqui:

public void inserirUsuario(UsuarioLocal usuarioLocal){  
    EntityManager em = JPAUtil.getInstance("bancoLocal").getEntityManager();  
    em.persist(usuarioLocal);  
    em.getTransaction().commit();  
    em.close();  
  
}

Tenta colocar o getTransaction().begin().

public void inserirUsuario(UsuarioLocal usuarioLocal){  
    EntityManager em = JPAUtil.getInstance("bancoLocal").getEntityManager();  
    em.getTransaction().begin();
    em.persist(usuarioLocal);  
    em.getTransaction().commit();  
    em.close();  
  
}
EuclidesFilizola

Bom dia Andre, o gettransection.begin() está dentro desse método

public EntityManager getEntityManager() {

		EntityManager toReturn = emf.createEntityManager();
		toReturn.getTransaction().begin();

		return toReturn;
	}

dae vc pode verificar q ele está sendo chamado assim

EntityManager em = JPAUtil.getInstance("bancoLocal").getEntityManager();
Criado 23 de setembro de 2009
Ultima resposta 24 de set. de 2009
Respostas 4
Participantes 3