Hibernate não atualiza dados

17 respostas
D

e ai galera blz

vou postar meus códigos ai se alguém puder me ajudar agradeço desde já

o que acontece e o seguinte eu crio minhas tabelas com um create e mudo para update ou validate e uso um saveOrUpdate mesmo assim ele cria dados novos.

//bean
@Entity
@Table(name = "CATEGORIA")
public class Categoria implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_categoria", nullable = false, length = 20)
    private Integer id_categoria;
    @Column(name = "descricao", nullable = false, length = 40)
    private String descricao;
    @OneToMany
    private Collection<Subcategoria> subcategoria;

    public Integer getId_categoria() {
        return id_categoria;
    }

    public void setId_categoria(Integer id_categoria) {
        this.id_categoria = id_categoria;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
}
//AbstractDAO
@SuppressWarnings("serial")
public abstract class AbstractDAO extends HibernateUtil implements Serializable {

    public void  salvarOuAtualizar(Object obj) {
        Session session = null;
        Transaction transaction = null;
        try {
            session = HibernateUtil.getSession();
            transaction = session.beginTransaction();
            session.saveOrUpdate(obj);
            session.flush();
            transaction.commit();
            session.close();
        } catch (HibernateException e) {
            e.printStackTrace();
            transaction.rollback();
            throw new HibernateException("Falha ao salvar o "
                    + "objeto : "
                    + obj.toString()
                    + "(" + e.getMessage() + ")",
                    e.getCause());
        }
    }

    public void excluir(Object obj) {
        Session session = null;
        Transaction transaction = null;

        try {
            session = HibernateUtil.getSession();
            transaction = session.beginTransaction();
            session.delete(obj);
            session.flush();
            transaction.commit();
        } catch (HibernateException e) {
            transaction.rollback();
            throw new HibernateException("Falha"
                    + " ao excluir o objeto : "
                    + obj.toString() + "("
                    + e.getMessage() + ")",
                    e.getCause());
        }
    }

    public ArrayList<Object> buscarTodos(Class classe) {
        Criteria criteria = null;
        ArrayList<Object> dados = null;
        try {
            criteria = getSession().createCriteria(classe);

            dados = (ArrayList<Object>) criteria.list();
        } catch (Exception e) {
            throw new HibernateException("Method: CONSULTA_TODOS, erro: " + e.getLocalizedMessage());
        } finally {
        }
        return dados;
    }
    
    
}
//Hibernate
public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static Session session = null;

    private static SessionFactory buildSessionFactory() {
        return new AnnotationConfiguration().configure().buildSessionFactory();
    }

    public static Session getSession() {
        if (session == null || !session.isOpen()) {
            session = sessionFactory.openSession();
        }

        return session;
    }
}
//hibernate.cfg
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

        <!--  localhost || ip do servidor     -->                                  
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/despesas</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">***********</property>

        <property name="hbm2ddl.auto">validate</property>
        
       <!--<property name="hbm2ddl.auto">update</property>-->
       <!--<property name="hbm2ddl.auto">validate</property>-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        
        <!-- Mapear todos as classes persistentes ou seja os beans-->
        <mapping class="br.com.despesas.bean.Categoria"/>
        <mapping class="br.com.despesas.bean.Subcategoria"/>
        <mapping class="br.com.despesas.bean.Despesa"/>
        
                        
    </session-factory>
</hibernate-configuration>

17 Respostas

R

Mas o que tem haver o “hbm2ddl.auto” como o método saveOrUpdate() ?

Não entendia a sua dúvida, pode tentar se explicar novamente? A propriedade “hbm2ddl.auto” serve apenas para criar as tabelas do banco, e o método saveOrUpdate() apenas para salvar e alterar os dados.

Então, não sei qual tipo de relação você está tentando fazer entre os dois.

D

o hbm2ddl.auto e para create/update/validate

o problema e q não esta atualizando no banco

A

Não sei se eu entendi direito a sua dúvida. O hbm2ddl.auto é para criação das suas tabelas no banco a partir das suas classes (entidades). Não tem relação nenhuma com o método saveOrUpdate. Se a configuração do hbm2ddl.auto for update, ele vai comparar suas entidades com as tabelas no banco e atualizar qualquer informação nova no seu banco de dados. Se for create-drop, ele vai excluir todas as tabelas do banco e criar tudo de novo.

O método saveOrUpdate persiste os dados no banco de dados.

No seu caso, o exemplo que você colocou foi o da Categoria. Se o id_categoria não estiver preenchido, ele vai fazer um insert no banco de dados. Porém, se ele estiver prenchido, ele vai procurar por este ID no banco de dados e fazer um update. Se você passar um ID que não existe no banco de dados, será lançada uma exception.

I

entenda que o parametro hbm2ddl.auto é para atualizar fisicamente o banco de dados: tamanho de coluna, nome de coluna, nova coluna, nome de tabela, etc

e o saveOrUpdate é para alterar o registro de uma tabela

Tem uma grande diferença entre os dois…

se toda vez que vc chama o seu método salvarOuAtualizar(Object obj) ele estiver adicionando um novo registro (nd a ver com hbm2ddl.auto do hibernate), quer dizer que ele ta gerando um novo ID toda vez, aí é problema de como vc ta recuperando seu objeto que vc quer alterar

K

mude seu hbm2ddl.auto para update.
Ele vai criar se não tiver, e se tiver vai fazer o update das tabelas do banco.

R

diegodanossa:
o hbm2ddl.auto e para create/update/validate

o problema e q não esta atualizando no banco

Eu sei para que serve, a questão é, com todo o respeito, você sabe realmente o significado disso?

Você parece que está confundindo as coisas. Por isso ficou difícil de entender qual realmente é a sua dúvida.

D

Sim entendo a diferanca de cada um deles

R

Opa, blz…
Explica melhor então qual sua dúvida. Veja que não foi só eu que ficou com dúvida sobre o seu problema.

D

vou postar meu metodo salvar pra ver se fica + claro

D
try {
            AbstractDAO AbstractDAO = new AbstractDAO() {
            };
            Categoria Categoria = new Categoria();
            Categoria.setDescricao(txtDescricao.getText());
            AbstractDAO.salvarOuAtualizar(Categoria);
            JOptionPane.showMessageDialog(null, "Dados salvo com sucesso. ");
            txtDescricao.setText(null);
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao salvar dados " + e);
        }
R

Você não pode instanciar um classe abstrata. O compilador do Java não permite. Você só pode herda-la, e assim, terá acesso a seus métodos na classe que a herdou.

D

erro sobre AbstractDAO arrumado

  • o erro continua
D

ele nao atualiza o id do banco e cria um novo

R

Você está tentando fazer um update?

Se for, você precisa passar o objeto a ser alterado com o Id dele, assim, o saveOrUpdate() consegue saber que o id já existe no banco e faz um update e não um save. Você precisa fazer uma consulta no banco para recuperar o objeto que será alterado, e então altera os campos necessários e depois faz a chamada ao saveOrUpdate().

D

E ai galera blz

meu problema e na verificação de ids mesmo, mas estou tentando aqui e não da certo, sou novo com Hibernate.

Alguem tem um exemplo ai

R

diegodanossa:
E ai galera blz

meu problema e na verificação de ids mesmo, mas estou tentando aqui e não da certo, sou novo com Hibernate.

Alguem tem um exemplo ai

Tenho esse tutorial, da uma olhada: Utilizando Swing com Hibernate (SessionFactory)

R

Diego so complementando o qie o romarcio falou… voce sempre da um new categoria por isso ele sempre ira inserir um novo registro… pois e um objeto novo… ou seja e um objeto transiente… estudes os conceitos de transientes e persistentes que c vai entender mwlhor to digitando do celular… desculpe os erros ortograficos

Criado 20 de dezembro de 2012
Ultima resposta 15 de jan. de 2013
Respostas 17
Participantes 6