[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 controllerpublicvoidaltera(Produtoproduto){dao.atualiza(produto);result.redirectTo(this).lista();}//metodo atualiza do DAOpublicvoidatualiza(Produtoproduto){Transactiontx=session.beginTransaction();session.update(produto);tx.commit();}//como obtenho a session no contrutor do DAOpublicstaticSessiongetSession(){ServiceRegistryserviceRegistry=newServiceRegistryBuilder().configure().buildServiceRegistry();MetadataSourcesmetadataSources=newMetadataSources(serviceRegistry);metadataSources.addAnnotatedClass(Produto.class);SessionFactorysessionFactory=metadataSources.buildMetadata().buildSessionFactory();Sessionsession=sessionFactory.openSession();returnsession;}
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 =(:
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();
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.