Hibernate + Metodos Crud [RESOLVIDO]

21 respostas
franz_Ozil

eaiiii Gennnnte rs , estou implementando uma aplicação CRUD onde aprende conceitos de DAO e MVC agora estou utilizando o Hibernate (da hora vey )
porém estou com muitas duvidas em algumas opeções por exemplo na consulta usando o FIND como eu faço para passa outro campo que não seja o ID ? se eu colocar um Index na associado a coluna eu posso usar no FIND ?

Estou Criando minha Classe - Tabela .

@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column (name = "idcliente")
int idCli;
int idade;
@IndexColumn(name="RG")
String rg ;

21 Respostas

franz_Ozil

ocorre uma excessão quando é execultado a seguinte Operação .

transacao.createQuery("delete from cadcliente where RG ='"+conscli.getRg()+"'").executeUpdate();

excessão :

Caused by: org.hibernate.hql.ast.QuerySyntaxException: CadCliente is not mapped [delete From CadCliente where RG ='44.444.444-4']
drsmachado
  • O método find não aceita nenhum outro campo senão o ID, se quiser usar outro, precisará aplicar HQL ou Criteria.
  • Como você fez o mapeamento da classe CadCliente?
  • Como você está criando as sessões?
franz_Ozil

vish cara estou usando o EntityManager e o EntityManagerFactory como funciona as session ?

//POJO
@Entity
@Table (name = "CADCLIENTE")
public class Cliente {
	
	@Id
	@GeneratedValue (strategy = GenerationType.IDENTITY)
	@Column (name = "idcliente")
	int idCli;
	int idade;
	@IndexColumn(name="RG")
	String rg ;
	String nome, end, fone, uf, sexo, observacoes, email;
	
	public Cliente(){
		
	}
	
	public int getIdCli() {
		return idCli;
	}

fiz Get e Set para todos os atributos .

o arquivo XML de persistencia ta assim :

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="persistencia" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>br.edu.unip.Model.Cliente</class>
    <properties>
		<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" ></property>
		<property name= "hibernate.hbm2ddl.auto" value="update" ></property>
		<property name="hibernate.show_sql" value="true" ></property>
		<property name="hibernate.format_sql" value="true" />
		<property name="use_sql_comments" value="true" />
		<property name="hibernate.autocommit" value="false" />		
		<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
		<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/bdaulasjava" ></property>
		<property name="javax.persistence.jdbc.user" value="root" ></property>
		<property name="javax.persistence.jdbc.password" value="" ></property>
	</properties>
  </persistence-unit>
</persistence>
drsmachado

Está usando JPA 2 então, logo, não existe sessão.
Veja que no teu persistence.xml você coloca

<persistence-unit name="persistencia" transaction-type="RESOURCE_LOCAL">  
    <provider>org.hibernate.ejb.HibernatePersistence</provider>  
    <class>br.edu.unip.Model.Cliente</class>  
    <properties>

Onde está a classe CadCliente?
Todas as classes que você mapeou com a annotation @Entity devem ser listadas como uma

franz_Ozil

ah beleza então Cadcliente foi o nome dado na criação da tabela no banco de dados minha classe e a Cliente , esse criteria , e um criterio de comandos ? meu objetivo e fazer as operações utilizando o campo RG

drsmachado

Bom, como a tabela tem o nome CadCliente, creio que a classe que a representa é a classe Cliente, certo?
Então, precisa adicionar a annotation @Table

@Table(name="CadCliente")
public class Cliente implements Serializable{

Criteria é uma parte da API do Hibernate que, ao meu ver, é muito mais elegante que HQL.

franz_Ozil

tipo assim cara ?
achei este exemplo

Query query = em.createQuery(
      "DELETE FROM Country c WHERE c.population < :p");
  int deletedCount = query.setParameter(p, 100000).executeUpdate();

no meu caso ficaria assim
?

Query query =transacao.createQuery("delete from cadcliente c where c.RG =':p'");
			int deletedCount = query.setParameter(conscli.rg,jan.txtRg.getText()).executeUpdate();
drsmachado

Isso aí é HQL.
Agora, perceba que você não conhece o banco de dados, não sabe nem qual é a tabela (mentirinha) que está armazenando os dados do Cliente.
Para a consulta, você deve fazer de conta que só sabe que quer todos os clientes onde o RG = ao que você passar.
Como você não sabe o nome da tabela, mas sabe o nome da classe, troque cadcliente pelo nome da classe e veja a mágica acontecer.

franz_Ozil

hahah eu sei sim vey

Query query =transacao.createQuery("delete from "+Cliente.class+" c where c.RG ='"+jan.txtRg.getText()+"'");
			int deletedCount = query.setParameter(conscli.rg,jan.txtRg.getText()).executeUpdate();

deu este exception

java.lang.IllegalArgumentException: node to traverse cannot be null!
drsmachado

Não, não.
É o nome da classe, que, por sinal, é Cliente mesmo (observe o case sensitive).

Query query =transacao.createQuery("delete from Cliente c where c.RG ='"+jan.txtRg.getText()+"'");
franz_Ozil

hahah agora entendi , porém ainda ta dando esta excessão :

javax.persistence.TransactionRequiredException: Executing an update/delete query

drsmachado

Uma opção seria

Query query =transacao.createQuery("delete from "+ Cliente.class.getSimpleName() +" c where c.RG ='"+jan.txtRg.getText()+"'");
drsmachado

A exceção é ocasionada por que esta linha

int deletedCount = query.setParameter(conscli.rg,jan.txtRg.getText()).executeUpdate();

Tem um monte de doidera…
Qual o sentido dela?
Se você quer consultar, deve apenas chamar o método uniqueResult, do objeto da interface Query

Cliente cli = query.uniqueResult();
//mas atenção, só use uniqueResult se o RG for único no sistema mesmo, caso contrário, use o método list()
List<Cliente> clientes = query.list();

Se quer deletar, não precisa de query, invoque o método remove do objeto de EntityManager.

franz_Ozil

vish cara funcinou não haha




franz_Ozil

entendi , List <> coleção de dados neh , agora sim você fez a consulta verificou se existe preenche o objeto da classe e depois removeu foi isso ?

drsmachado

Não.
Uma coisa de cada vez.
Se você pretende primeiro buscar, use o método de busca (tanto faz uniqueResult ou list, de acordo com o número de resultados esperados).
Feito isso, invoque o método remove, que é um método do EntityManager e que recebe como parâmetro o objeto que se deseja remover.

franz_Ozil

O uniqueResult(); não aparece aqui não cara , este Query faz parte do pesistence ou de outra biblioteca ?

drsmachado

da Query…

franz_Ozil

Fiz o Seguinte man :

Query query = (Query) transacao.createQuery("select * from "+ Cliente.class.getSimpleName() +" c where c.rg ='"+jan.txtRg.getText()+"'");  
		    conscli= (Cliente) query.uniqueResult();  
		    
		    //Query query =transacao.createQuery("delete from Cliente  c where c.rg ='"+jan.txtRg.getText()+"'");
			
			
			if (conscli!=null)
			{

				transacao.getTransaction().begin();
				((EntityManager) transacao).remove(conscli);
				transacao.getTransaction().commit();

				JOptionPane.showConfirmDialog(null, "sucesso");
			}
			else {
				JOptionPane.showConfirmDialog(null, "falhou");

			}
			
		} catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showConfirmDialog(null, e.getMessage());

		}

porém ainda não deu certo (negocio tenso )
mais ta quase la
exception

java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from br.edu.unip.Model.Cliente c where c.rg ='44.444.444-4']

:

franz_Ozil

Funcionou veyyy vlw

transacao.getTransaction().begin();
			Query query = transacao.createQuery("select c.rg from Cliete c where c.rg =:rg ");  
			query.setParameter("rg", jan.txtRg.getText());
			query.executeUpdate();
			conscli= (Cliente) query.getSingleResult();
franz_Ozil

o erro estava ocorrendo porque eu ainda não havia iniciado a transação no gettransaction().begin();
agora esta funcionando (Y)

Criado 31 de outubro de 2012
Ultima resposta 1 de nov. de 2012
Respostas 21
Participantes 2