[RESOLVIDO] Hibernate 4 - insere, remove, consulta mas não atualiza

7 respostas
vinicius_roc

Boa tarde amigos,

Estou estudando a apostila fj28, a ao invés do hibernate da apostila estou usando o 4.

Estou na parte da pagina de atualizar, remover, lista e adicionar. Quando terminamos o CRUD.

Só que esta acontecendo algo muito estranho. Eu consigo adicionar um produto, listar e remover. Mas quando vou alterar nada acontece.

//metodo altera do controller
public void altera(Produto produto) {
		dao.atualiza(produto);
		result.redirectTo(this).lista();
	}

//metodo atualiza do DAO
public void atualiza(Produto produto) {
		Transaction tx = session.beginTransaction();
		session.update(produto);
		tx.commit();
	}

//como obtenho a session no contrutor do DAO
public static Session getSession() {
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().configure().buildServiceRegistry();
		MetadataSources metadataSources = new MetadataSources(serviceRegistry);
		metadataSources.addAnnotatedClass(Produto.class);
		
		SessionFactory sessionFactory = metadataSources.buildMetadata().buildSessionFactory();
		
		Session session = sessionFactory.openSession();
		return session;
	}

Alguem tem alguma ideia do que acontece?

Muito obrigado

7 Respostas

aix

acredito que precise dar um find( ou load ) no objeto a atualizar e depois sim persistir, com JPA eu faço um merge depois um flush e depois um comit.

vinicius_roc

Eu ja tentei fazer o load, alterar e depois comitar. Não deu certo =/. O commit faz o flush tb, aparece até no log.

E o engraçado é que, quando busco pelo load(id) ele me traz o objeto Produto persisto pelo Hibernate (Produto_javass…) e com todas as propriedes nulas, retornando apenas quando invoco os gets, ja quando busco pelo get(id) ele me traz o objeto Produto mesmo, como todas as propriedades setadas. Mas ambas as abordagens não salvam a alteração do banco =(.

E quando executo o codigo abaixo, ele imprime certo (teste, Alterado, Alterado), mas no banco não muda nada =(:

Produto produto = carregaProduto();
System.out.println(produto.getNome());
produto.setNome("Alterado");
System.out.println(produto.getNome());
produtoDao.atualiza(produto);
produto = carregaProduto();
System.out.println(produto.getNome());
vinicius_roc

Alguém ja esta conseguindo usar bem este hibernate 4?

<?xml version='1.0' encoding='utf-8'?>
<hibernate-configuration xmlns="http://www.hibernate.org/xsd/hibernate-configuration">
	<session-factory>
		<property name="hibernate.connection.username">usuario</property>
		<property name="hibernate.connection.password">senha</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/fj28</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
	</session-factory>
</hibernate-configuration>
vinicius_roc

Realizei os mesmos teste, com as mesmas classes e configurações usando o hibernate 3 e no 3 funcionou, a unica diferença foi a forma de obter a sessão.
Qual a forma correta de criar uma sessão ou persistir no banco as alterações feitas na session, no hibernate 4?

Hibernate 3

AnnotationConfiguration cfg = new AnnotationConfiguration();  
cfg.addAnnotatedClass(Produto.class);  
          
session = cfg.configure().buildSessionFactory().openSession();

Hibernate 4

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().configure().buildServiceRegistry();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
metadataSources.addAnnotatedClass(Produto.class);
		
SessionFactory sessionFactory = metadataSources.buildMetadata().buildSessionFactory();
		
Session session = sessionFactory.openSession();
Rodrigo_Sasaki

Dê uma lida:

http://guj.com.br/java/269963-hibernate-4-x-mysql-auto_increment

vinicius_roc

Consegui pessoal. Depois de tanto pesquisar deu certo. Fiz da seguinte forma:

Configuration configuration = new Configuration();
configuration.configure();
		
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
											    .buildServiceRegistry();

SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);
Session session = factory.openSession();

Porem sei que essa forma é para adaptar com o hibernate 3. Dizem que não sera mais possivel usar essa classe configuration e o certo seria usar da forma que tentei no principio sem usar configuration. Alguem pode confirmar?

Muito Obrigado

vinicius_roc

Vlw digaoneves! É uma pena que eles tenham lançado algo tão usado, prometendo mil coisas e dando varios paus.
No fim parece apenas que o 4 é para uma transição do 3 para o 5, onde para conseguir fazer oque você precisa, você deve utilizar um pouco de cada.

Lamentavel

Criado 1 de junho de 2012
Ultima resposta 6 de jun. de 2012
Respostas 7
Participantes 3