2017-03-10 4 views
0

Ich habe ein Servlet, und wenn ich diese Methode mit H2 in der PU angegeben aufrufen, erstellt es die gesamte Datenbankstruktur jedes Mal neu, wenn ich es rufe. Kann ich diese Methode nur einmal aufrufen, und wenn ich sie> 1 Mal anrufen kann, wie mache ich das?Aufruf Persistence.createEntityManagerFactory> 1 mal

entityManagerFactory = Persistence 
        .createEntityManagerFactory("MYPU"); 

XML für die Persistenz

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="MyJPAJAXRS" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <non-jta-data-source>jdbc/myds</non-jta-data-source> 
    <properties> 
     <property name="javax.persistence.schema-generation.database.action" 
       value="drop-and-create"/> 
     <property name="javax.persistence.sql-load-script-source" value="META-INF/seed.sql"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

Antwort

1

Sie benötigen eine Singleton-Methode, um EntityManagerFactory zu erstellen und dann eine neue Instanz von EntityManager mit dieser Singleton-Instanz zu erhalten. Hinweis: EntityManager ist nicht Thread-sicher und Sie müssen eine neue EntityManager-Instanz pro Thread erhalten. Unten ist ein Beispiel dafür, wie diese

public class JpaUtil { 

private static HashMap<String, String> properties = new HashMap<String, String>(); 
private volatile static EntityManagerFactory factory; 

static { 
    properties.put("javax.persistence.jdbc.driver", System.getProperty("DRIVER")); 
    properties.put("javax.persistence.jdbc.user", System.getProperty("USER")); 
    properties.put("javax.persistence.jdbc.password", System.getProperty("PASSWORD")); 
    properties.put("javax.persistence.jdbc.url", System.getProperty("DATABASEURL")); 
} 

private static EntityManagerFactory getInstance() { 
    if (factory == null) { 
     synchronized (EntityManagerFactory.class) { 
      if (factory == null) { 

       factory = Persistence.createEntityManagerFactory("PU", properties); 
      } 
     } 
    } 
    return factory; 
} 

public static EntityManager getEntityManager() throws Exception { 
    return getInstance().createEntityManager(); 
} 

} 

zu implementieren und dann einfach den Entity Manager zu erhalten rufen: JpaUtil.getEntityManager()

+0

Danke, wenn man qq - warum die Eigenschaften? Ich habe den Verbindungsaufbau als eine JNDI-Ressource, die ich von persistence.xml referenziere. Ich kann das überspringen, ja? – mikeb

+0

Das war nur ein Beispiel. Wenn Sie die Requisiten bereits in Ihrer persistence.xml festlegen, müssen Sie die Eigenschaften hier nicht festlegen. Verwenden Sie einfach die andere überladene Methode: createEntityManagerFactory (String persistenceUnitName) –

+0

Bitte akzeptieren Sie auch, wenn ich Ihre ursprüngliche Frage beantwortet habe. Vielen Dank. –

1

Sie sollten eine Singleton EntityManagerFactory haben, dann können Sie createEntityManager nennen, wie viele Zeit, die Sie wollen.

Verwandte Themen