2010-11-20 4 views
1

Dans le code ci-dessous, persist() renvoie une exception, mais l'entité n'est pas stockée dans la base de données.Dans Spring MVC 3.0.5, l'entité JPA du contrôleur n'est pas conservée dans la base de données

@RequestMapping(method = RequestMethod.POST) 
public String form() { 
     EntityManager em = this.emf.createEntityManager(); 
     TaxRates t = new TaxRates(); 
     t.setCountry("US"); 
     // set more properties 
     em.persist(t); 
     em.close(); 
     ... 
} 

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 
    <persistence-unit name="TT-SpringMVCPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    ... 
    <class>com.sajee.db.TaxRates</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:jtds:sqlserver://localhost:1234/mydb"/> 
     <property name="javax.persistence.jdbc.password" value="Password1"/> 
     <property name="javax.persistence.jdbc.driver" value="net.sourceforge.jtds.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.user" value="sa"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

Je ne besoin d'aucun support de transaction ou tout support fonction de fantaisie de l'entreprise. Je veux simplement créer une entité et l'enregistrer dans la base de données.

Où est-ce que je me trompe?

Répondre

2

persist() n'écrit pas immédiatement votre objet dans la base de données. Au lieu de cela, il marque votre objet comme persistant, de sorte qu'il sera écrit dans la base de données avant la validation de la transaction (ou avant d'exécuter une requête, ou pendant une opération explicite flush()). Par conséquent, même si vous n'avez pas besoin d'un comportement transactionnel, vous devez toujours gérer les transactions. Vous pouvez le faire manuellement comme suit:

@RequestMapping(method = RequestMethod.POST) 
public String form() { 
     EntityManager em = this.emf.createEntityManager(); 
     TaxRates t = new TaxRates(); 
     t.setCountry("US"); 
     // set more properties 
     em.getTransaction().begin(); 
     em.persist(t); 
     em.getTransaction().commit(); 
     em.close(); 
     ... 
} 

Mais est une façon de faire plus pratique il.

Questions connexes