persistência - Persistir dados utilizando HSQLDB e Hibernate
Perguntas � persistência � Persistir dados utilizando HSQLDB e Hibernate
Persistir dados utilizando HSQLDB e Hibernate
Olá pessoal. Estou com dificuldade em persistir dados em um projeto Maven web no Tomcat 7 utilizando Spring, HSQLDB e Hibernate.
Tenho um form básico como os campos Nome e E-mail, que ao clicar em Salvar, vai para a página de listagem de pessoas. Quando clico em Salvar, o nome e e-mail da pessoa aparecem logo em seguida na página de listagem. Contudo, se eu navegar para outra página e voltar para a lista de membros, a pessoa já não aparece mais.
<persistence-unit name="projeto_PU" transaction-type="RESOURCE_LOCAL">
<class>br.com.rogeriogentil.projeto.negocio.modelo.Membro</class>
<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:db/projeto;locked=false;shutdown=true"/>
Vi que muitos já passaram por isto, mas em nenhuma das minhas tentativas consegui resolver.
E você fez um select no banco de dados para ver se os dados estão mesmo sendo inseridos?
— romarcio 15 de mai de 2014
Se você está usando o spring mvc, porque você não configura tudo dentro do contexto do spring e descarta o persistence.xml?
— Tiago 15 de mai de 2014
@romarcio: eu não consigo nem acessar a base utilizando DatabaseManager. É lançado a exceção "Database lock acquisition failure".
— rogerio_gentil 16 de mai de 2014
@Tiago pode ser uma opção, mas ainda não conheço todos os recursos do Spring MVC. Sempre trabalhei com JSF e Primefaces. Qual a vantagem em descartar o persistence.xml?
Você consegue ir no diretório para ver se sua base foi realmente criada fisicamente? Se sim, lá você terá um arquivo texto com o mesmo nome do seu banco de dador. Abra esse arquivo e você poderá visualizar todos os inserts que foram registrados.
— romarcio 16 de mai de 2014
@romarcio Os arquivos .lck, .log, .properties e .script e o diretório .tmp são criados. No arquivo .log há registros de CREATEs, SETs, ALTERs e GRANTs, mas nada de INSERT. Deveria ser criado um arquivo com o nome do base sem extensão?
No meu caso foi criado um arquivo txt com o nome do banco e não um arquivo de .log. Mas talvez seja apenas uma diferença na versão do HSQLDB. Acho que esse é o arquivo certo mesmo. Deveria ter incluso as instruções de insert também, como não tem, acredito que o insert não esteja sendo executado. O HSQLDB precisa da instrução SHUTDOWN para escrever no banco. Embora você tenha colocado na String de Conexão, parece que não está sendo executada. Vou colocar uma resposta com um exemplo de código de como você poderia forçar esse SHUTDOWN, usando JPA.
Aos interessados, resolvi a questão contornando o problema com uma outra abordagem. Basicamente segui os passos do seguinte tutorial: http://www.dataart.ru/blog/2013/03/web-application-with-spring-and-hibernate-from-scratch.
Resumindo: configurei todo o contexto de persistência dentro dos arquivos de configuração do Spring, integrando o Hibernate com Spring ORM e removendo o arquivo persistence.xml, conforme o @Tiago já havia sugerido.
Vejam como ficou parte do meu pom.xml alterado:
O arquivo de configuração do Hibernate (dataSource.xml) com os namespaces mais atuais:
<value>br.com.rogeriogentil.projeto.negocio.modelo</value>
Arquivo de configuração do Spring (dispatcher-servlet.xml):
<context:component-scan base-package="br.com.rogeriogentil.projeto" />
E o descritor de implantação (web.xml):
Como eu já tinha comentado, você pode forçar o SHUTDOWN no HSQLDB, para que ele escreva os dados inseridos. Para isso, você pode fazer algo do tipo:
Faça a chamada desse código após você fechar a conexão, por exemplo:
@romarcio ainda não foi desta vez. Estranho que todas as vezes antes de executar o projeto no NetBeans, tenho que deletar o diretório db/ pois se eu executar sem excluir este diretório, é lançado a exceção:
HsqlException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@930c48df[file =/srv/apache-tomcat-7.0.37/bin/db/projeto.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2014-05-19 14:06:27 heartbeat - read: -9441 ms.
— rogerio_gentil 19 de mai de 2014
Por acaso o banco é criando dentro do diretório "apache-tomcat-7.0.37/bin/db/"? Não seria o indicado, porque a pasta bin é de uso da inicialização do tomcat. Faça o banco ser criado em outro diretório para ver se a exceção desaparece.
— romarcio 19 de mai de 2014
@romarcio Já tinha tentando dar permissão total ao diretório db/ (chmod -R 777) e agora até mudei de local colocando no meu /home, mas nada feito! Vou seguir alguns tutoriais e reproduzir alguns exemplos para ver se consigo encontrar alguma pista. Se tiver mais alguma ideia, eu testarei aqui. Valeu!
Não é a resposta que estava procurando? Procure outras perguntas com as tags persistência hibernate java maven ou faça a sua própria pergunta.