Erro ao dar update em table

8 respostas
Jackye

Olá!

Estou desenvolvendo um sistema bibliotecário como projeto de final de curso.

No meu sistema criei um metodo que faça update de um campo quando o livro for emprestado.

Veja o metodo que fiz no emprestimoDAO:
List<Exemplar>exemplares;
public void mudarStatusEmprestimo(int Codigo) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        exemplares = session.createQuery("UPDATE Exemplar set inEmprestimo = 1 where codExemplar = " + Codigo).list();
    }
Em uma classe de teste eu chamo esse metodo:
public static void main(String[] args) {
        Session sessao = HibernateUtil.getSessionFactory().openSession();
        Transaction transacao = sessao.beginTransaction();

        ExemplarDAO exemplarDAO = new ExemplarDAO();
        Emprestimo emprestimo = new Emprestimo();

        Usuario usuario = (Usuario) sessao.load(Usuario.class, 8);

        emprestimo.setCodUsuario(usuario);
        emprestimo.setDaEmprestimo(new Date());
        emprestimo.setDaDevolucao(new Date());
        
//Aqui defino qual o codigo do exemplar da obra
        Exemplar exemplObra2 = exemplarDAO.findById(35);
        int Codigo = 35; 

        try {
//Neste laço eu vejo se o campo do Inconsulta (Campo que distingui se o livro é pra empréstimo ou consulta) é 1 =só pra consulta ou 0 = pode ser emprestado.
            if (exemplObra2.getInConsulta() != 1) {
                emprestimo.getExemplar().add(exemplObra2);
                JOptionPane.showMessageDialog(null, "Empréstimo efetuado com sucesso!!");
//Aqui eu chamo o método do Update para atualizar o campo InEmprestimo do exemplar para 1 = emprestada. (Num método de devolução faço o contrário, atualizo para 0 = disponível)
                EmprestimoDAO.fabricaEmprestimoDAO().mudarStatusEmprestimo(Codigo);
                sessao.save(emprestimo);
                transacao.commit();
            } else {
                JOptionPane.showMessageDialog(null, "Este não pode ser emprestado!");
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Empréstimo não efetuado: " + e);
        }

        sessao.close();
    }

Quando executo dá o seguinte erro:
[color=red]Not supported for DML operations [UPDATE Dominio.Exemplar set inEmprestimo = 1 where codExemplar = 35][/color]

Por que deu esse erro?
Tem um jeito melhor e mais viável?

Agradeço.

8 Respostas

ssh
Jackye:
Olá!

Estou desenvolvendo um sistema bibliotecário como projeto de final de curso.

No meu sistema criei um metodo que faça update de um campo quando o livro for emprestado.

Veja o metodo que fiz no emprestimoDAO:
List<Exemplar>exemplares;
public void mudarStatusEmprestimo(int Codigo) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        exemplares = session.createQuery("UPDATE Exemplar set inEmprestimo = 1 where codExemplar = " + Codigo).list();
    }
Em uma classe de teste eu chamo esse metodo:
public static void main(String[] args) {
        Session sessao = HibernateUtil.getSessionFactory().openSession();
        Transaction transacao = sessao.beginTransaction();

        ExemplarDAO exemplarDAO = new ExemplarDAO();
        Emprestimo emprestimo = new Emprestimo();

        Usuario usuario = (Usuario) sessao.load(Usuario.class, 8);

        emprestimo.setCodUsuario(usuario);
        emprestimo.setDaEmprestimo(new Date());
        emprestimo.setDaDevolucao(new Date());
        
//Aqui defino qual o codigo do exemplar da obra
        Exemplar exemplObra2 = exemplarDAO.findById(35);
        int Codigo = 35; 

        try {
//Neste laço eu vejo se o campo do Inconsulta (Campo que distingui se o livro é pra empréstimo ou consulta) é 1 =só pra consulta ou 0 = pode ser emprestado.
            if (exemplObra2.getInConsulta() != 1) {
                emprestimo.getExemplar().add(exemplObra2);
                JOptionPane.showMessageDialog(null, "Empréstimo efetuado com sucesso!!");
//Aqui eu chamo o método do Update para atualizar o campo InEmprestimo do exemplar para 1 = emprestada. (Num método de devolução faço o contrário, atualizo para 0 = disponível)
                EmprestimoDAO.fabricaEmprestimoDAO().mudarStatusEmprestimo(Codigo);
                sessao.save(emprestimo);
                transacao.commit();
            } else {
                JOptionPane.showMessageDialog(null, "Este não pode ser emprestado!");
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Empréstimo não efetuado: " + e);
        }

        sessao.close();
    }

Quando executo dá o seguinte erro:
[color=red]Not supported for DML operations [UPDATE Dominio.Exemplar set inEmprestimo = 1 where codExemplar = 35][/color]

Por que deu esse erro?
Tem um jeito melhor e mais viável?

Agradeço.

List<Exemplar>exemplares;  
public void mudarStatusEmprestimo(int Codigo) {  
        Session session = HibernateUtil.getSessionFactory().openSession();  
        exemplares = session.createQuery("UPDATE Exemplar set inEmprestimo = 1 where codExemplar = " + Codigo.list());  
    }
testa assim, achei um ")" perdido por ai.
Jackye

Oi ssh!

Continua dando o mesmo erro.
:cry:

fbl.lucas

public void mudarStatusEmprestimo(int Codigo) { Session session = HibernateUtil.getSessionFactory().openSession(); session.createQuery("UPDATE Exemplar set inEmprestimo = 1 where codExemplar = " + Codigo).executeUpdate(); }

Jackye

Oi fbl.lucas!

Quando executei, o método ficou me dando entrada.
Porque?

fbl.lucas

Jackye:
Oi fbl.lucas!

Quando executei, o método ficou me dando entrada.
Porque?


dando entrada? o que você quis dizer com isso?

Jackye
fbl.lucas, quando eu executar o seguinte código:
public static void main(String[] args) {  
        Session sessao = HibernateUtil.getSessionFactory().openSession();  
        Transaction transacao = sessao.beginTransaction();  
  
        ExemplarDAO exemplarDAO = new ExemplarDAO();  
        Emprestimo emprestimo = new Emprestimo();  
  
        Usuario usuario = (Usuario) sessao.load(Usuario.class, 8);  
  
        emprestimo.setCodUsuario(usuario);  
        emprestimo.setDaEmprestimo(new Date());  
        emprestimo.setDaDevolucao(new Date());  
          
//Aqui defino qual o codigo do exemplar da obra  
        Exemplar exemplObra2 = exemplarDAO.findById(35);  
        int Codigo = 35;   
  
        try {  
//Neste laço eu vejo se o campo do Inconsulta (Campo que distingui se o livro é pra empréstimo ou consulta) é 1 =só pra consulta ou 0 = pode ser emprestado.  
            if (exemplObra2.getInConsulta() != 1) {  
                emprestimo.getExemplar().add(exemplObra2);  
                JOptionPane.showMessageDialog(null, "Empréstimo efetuado com sucesso!!");  
//Aqui eu chamo o método do Update para atualizar o campo InEmprestimo do exemplar para 1 = emprestada. (Num método de devolução faço o contrário, atualizo para 0 = disponível)  
                EmprestimoDAO.fabricaEmprestimoDAO().mudarStatusEmprestimo(Codigo);  
                sessao.save(emprestimo);  
                transacao.commit();  
            } else {  
                JOptionPane.showMessageDialog(null, "Este não pode ser emprestado!");  
            }  
        } catch (Exception e) {  
            JOptionPane.showMessageDialog(null, "Empréstimo não efetuado: " + e);  
        }  
  
        sessao.close();  
    }
Depois que passar nesta linha
ExemplarDAO.fabricaExemplarDAO().mudarStatusEmprestimo(Codigo);
Ele deve fazer a alteração, passando por esse codigo em exemplarDAO:(Mudei agora pra esta classe de persistência, mas não altera em nada a mudança)
public void mudarStatusEmprestimo(int Codigo) {      
        Session session = HibernateUtil.getSessionFactory().openSession();      
        session.createQuery("UPDATE Exemplar set inEmprestimo = 1 where codExemplar = " + Codigo).executeUpdate();  
    }
E depois passar para salvar o empréstimo
sessao.save(emprestimo);
. Só que ele não tá fazendo isso. Tá ficando tipo aberto e não termina a execução.
ViniGodoy

Tópico movido para o fórum de interface gráfica. Por favor, leia com atenção a lista de fóruns antes de postar.

Jackye

Se tiver movido este tópico para interface gráfica por causa do ‘table’ que usei no campo assunto.
Então, desculpe, acho que utilizei o termo errado, quando eu me referi a table foi tabela de banco de dados. E não Jtable. Perdão.
:lol:

Criado 15 de fevereiro de 2012
Ultima resposta 15 de fev. de 2012
Respostas 8
Participantes 4