Кажется, em.persist не сохраняет данные в базе данных postgreSQL. - PullRequest
1 голос
/ 30 апреля 2010

У меня есть простой Java-файл, который должен записывать данные bean-компонента в базу данных PostgreSQL. Я использую Entity Manager для сохранения или обновления объекта. Я использую hibernate и подключение драйвера toplink, которые указаны в файле persistence.xml. Когда я вызываю em.persist (obj), в базе данных ничего не сохраняется, я не знаю почему. вот мой простой код:

private static void importa(FileReader f) throws IOException {

  EntityManagerFactory emf = Persistence
  .createEntityManagerFactory("orpt2");
  EntityManager em = emf.createEntityManager();

dispositivoMedico = new DispositivoMedico();
dispositivoMedico.setCategoria("prova");
dispositivoMedico.setCodice("323");
em.persist(dispositivoMedico);

А вот и моя настойчивость. Xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
 xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
 <persistence-unit name="orpt2">
   <class>it.ariadne.orpt2.entities.AccessoriScheda</class>
    <class>it.ariadne.orpt2.entities.CampiSchede</class>
  <class>it.ariadne.orpt2.entities.CampiSchedeSalvati</class>
  <class>it.ariadne.orpt2.entities.CampoAggiuntivo</class> 
   <class>it.ariadne.orpt2.entities.Categorie</class>
  <class>it.ariadne.orpt2.entities.CategorieCampi</class>
  <class>it.ariadne.orpt2.entities.CategorieCampiPK</class>
  <class>it.ariadne.orpt2.entities.ClasseCivab</class> 
  <class>it.ariadne.orpt2.entities.DecodificaStato</class>
  <class>it.ariadne.orpt2.entities.DispositivoMedico</class>
   <class>it.ariadne.orpt2.entities.Ente</class>
    <class>it.ariadne.orpt2.entities.FormaNegoziazione</class>
  <class>it.ariadne.orpt2.entities.Fornitore</class> 
  <class>it.ariadne.orpt2.entities.LogSession</class> 
  <class>it.ariadne.orpt2.entities.Modello</class> 
  <class>it.ariadne.orpt2.entities.Periodicita</class>
  <class>it.ariadne.orpt2.entities.Produttore</class>
   <class>it.ariadne.orpt2.entities.Ruolo</class>
  <class>it.ariadne.orpt2.entities.RuoloPK</class>
  <class>it.ariadne.orpt2.entities.RuoloUtente</class> 
  <class>it.ariadne.orpt2.entities.Scheda</class>
  <class>it.ariadne.orpt2.entities.SchedaSalvata</class>
  <class>it.ariadne.orpt2.entities.Tipologia</class> 
   <class>it.ariadne.orpt2.entities.Utente</class>

  <!-- locale 2010--><!-- optsanmatteo_prova300310 -->
   <properties>

   <property name="hibernate.connection.driver_class"
    value="org.postgresql.Driver" />

   <property name="hibernate.connection.url"
    value="jdbc:postgresql://localhost:5432/optsanmatteo_provaHash" />

   <property name="hibernate.connection.password"
    value="s4sh4gr3y" />

   <property name="hibernate.connection.username"
    value="sanmatteo" />

   <property name="hibernate.dialect"
    value="org.hibernate.dialect.PostgreSQLDialect" />


   <property name="toplink.logging.level" value="WARNING" />
   <property name="toplink.jdbc.driver"
    value="org.postgresql.Driver" />

   <property name="toplink.jdbc.url"
    value="jdbc:postgresql://localhost:5432/optsanmatteo_provaHash" />

   <property name="toplink.jdbc.password" value="s4sh4gr3y" />

   <property name="toplink.jdbc.user"
    value="sanmatteo" />
  </properties>

 </persistence-unit>

</persistence>

Спасибо за вашу помощь.

Mario

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Во-первых, операции persist, merge, remove не будут напрямую попадать в базу данных, они изменят состояние объектовв памяти - в контексте постоянства (транзакция).Когда транзакция совершена или если постоянный контекст сброшен , изменения записываются в базу данных.

Во-вторых,persist операция может быть вызвана только внутри транзакции, исключение будет выдано за пределами транзакции.Итак, вам нужно начать транзакцию.

Вот модифицированный пример:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("orpt2");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin(); // start a transaction

dispositivoMedico = new DispositivoMedico();
dispositivoMedico.setCategoria("prova");
dispositivoMedico.setCodice("323");

em.persist(dispositivoMedico);

em.getTransaction().commit(); // Commit the current resource transaction, writing
                              // any unflushed changes to the database.
1 голос
/ 30 апреля 2010

em.persist не сохраняет объект, он помечает его как постоянный, и при фиксации объект будет сохранен.

Я предполагаю, что из вашего фрагмента кода у вас нет коммита?

EntityTransaction tx = em.getTransaction();
tx.begin();

dispositivoMedico = new DispositivoMedico(); dispositivoMedico.setCategoria("prova"); dispositivoMedico.setCodice("323");
em.persist(dispositivoMedico);

tx.commit();
em.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...