2010-04-30 45 views
1

我有一個簡單的java main,它必須在PostgreSQL數據庫上寫入bean數據。我使用實體管理器來保存或更新對象。我使用在persistence.xml文件中指定的hibernate和toplink驅動程序連接。 當我調用em.persist(obj)時,沒有任何內容保存在數據庫中,我不知道爲什麼。這裏是我的簡單的代碼:em.persist似乎不會在postgreSQL數據庫上持久化數據庫db

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

這裏是我的persistence.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> 

謝謝您的幫助。

馬里奧

回答

1

em.persist不持續的對象,它標記爲可持久化,並在提交的對象將被持久化。

我從你的代碼片斷中假設你沒有提交?

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

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

tx.commit(); 
em.close(); 
+0

當我運行Java主,我覺得這是查詢執行過程中出現問題。當我做tx.commit()時,應用程序需要花費很多時間來執行查詢並且不會出現任何錯誤。似乎toplink和hibernate之間存在一些衝突。我能做什麼? 謝謝你的幫助 – Mario 2010-04-30 16:04:55

2

首先,persistmergeremove操作不會直接打在數據庫中,他們改變對象的狀態在內存 - 在持久化上下文(交易)。當事務是committed,或者如果持久性上下文是flushed,則更改將寫入數據庫。

其次,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.