2010-04-30 4 views
1

J'ai un simple Java principal qui doit écrire des données de bean sur une base de données PostgreSQL. J'utilise Entity manager pour persister ou mettre à jour l'objet. J'utilise hibernate et toplink driver connection qui sont spécifiés dans le fichier persistence.xml. Quand j'appelle em.persist (obj), rien n'est sauvegardé dans la base de données, je ne sais pas pourquoi. voici mon code simple:em.persist semble ne pas persister des données sur 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); 

Et voici mon 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> 

Merci pour votre aide.

Mario

Répondre

1

em.persist ne persiste pas l'objet, il marque comme persistable et à la validation de l'objet sera persisté.

Je suppose de votre fragment de code que vous n'avez pas de validation?

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

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

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

Quand je lance la principale java, je pense qu'il ya un problème lors de l'exécution de la requête. Quand je fais tx.commit(), l'application prend beaucoup de temps pour exécuter la requête et n'obtient aucune erreur. Il semble qu'il y ait des conflits entre le toplink et le hibernate. Que puis-je faire? Nous vous remercions de votre aide – Mario

2

D'abord, le persist, merge, remove opérations ne sera pas touché directement la base de données, ils changent l'état des objets en mémoire - dans le contexte de persistance (la transaction). Lorsque la transaction est committed ou si le contexte de persistance est flushed, les modifications sont écrites dans la base de données. Deuxièmement, l'opération persist ne peut être appelée que dans une transaction, une exception sera levée en dehors d'une transaction. Vous devez donc commencer une transaction.

Voici un exemple modifié:

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. 
Questions connexes