Hibernate não atualiza dados

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;
    }
}

[code]
//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;
}

}[/code]

[code]
//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;
}

}[/code]

//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>

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.

o hbm2ddl.auto e para create/update/validate

o problema e q não esta atualizando no banco

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.

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

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

[quote=diegodanossa]o hbm2ddl.auto e para create/update/validate

o problema e q não esta atualizando no banco[/quote]

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.

Sim entendo a diferanca de cada um deles

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.

vou postar meu metodo salvar pra ver se fica + claro

 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);
        }

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.

erro sobre AbstractDAO arrumado

  • o erro continua

ele nao atualiza o id do banco e cria um novo

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().

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

[quote=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[/quote]

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

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