JPA Erzeugen des EntityManagers

S

Sym

Gast
Hallo,

ich möchte für Tests einen javax.persistence.EntityManager erzeugen.

Derzeit mache ich das wie folgt:

Java:
final Map<String, String> properties = new HashMap<String, String>();
properties.put("hibernate.connection.url", "jdbc:h2:target/h2/"
		+ injectionPoint.getMember().getDeclaringClass().getName() + "_"
		+ new BigInteger(30, new SecureRandom()).toString(32) + ";FILE_LOCK=NO");

final EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitTest", properties);
return emf.createEntityManager();

Dadurch wird natürlich immer ein neuer EM erzeugt.

Ich möchte nun irgendwie prüfen, ob bereits ein EM existiert und diesen zurück geben. Ist das irgendwie mit JPA 2 bzw. Hibernate Boardmitteln möglich?
 
M

maki

Gast
AFAIK sollte die EMF nicht ständig neu erzeugt werden, der EM dagegen schon, stellt sowas wie eine "Session" dar.
 
M

maki

Gast
Für den "Prod" Betrieb oder für (Integrations-)Tests?
Bei letzterem ist es egal imho, aber selbst da kann man per @Before/@BeforeClass/Rule was stricken ohne auf Singletons(bäh) zurückzugreifen.

Im Prod Betrieb kommt es immer darauf, klar sollte es einen Weg geben den EMF einmal zu setzen und zu holen, falls man nicht auf Singletons(bäh) aufbauen will bieten sich DI Frameworks an die JPA bereits unterstützen, wie zB. Spring oder besser Guice, oder CDI mit Weld, je nach Anwendungstyp gibt es weitere, imho weniger elegante Möglichkeiten ;)
 
S

Sym

Gast
Es geht um Integrationstext in Verbindung mit CDI. Ich habe einen Producer, der den EntityManager erzeugt - aber eben nur auf diese Weise. Und ein Cachen hat mit Arquillian nicht geklappt. Deshalb hoffe ich, dass ich Boardmittel von JPA nutzen kann, ob an einen bestehenden EM zu kommen.
 

DanZ

Bekanntes Mitglied
Nein das wird nicht gehen und ist auch nicht die Aufgabe von JPA (versuch alleine mal einen eindeutigen Identifier für einen EMF zu basteln...). Wenn du in dem Integrationstest mit CDI arbeitest brauchst du doch vermutlich eh irgendwas Container ähnliches. Kann das nicht helfen?
 
M

maki

Gast
Warum willst du den EM/EMF denn cachen bzw. nicht für jeden Test neu erzeugen?

Alles neu erzeugen hat den tollen Nebeneffekt, die Tests wirklich zu separieren und eine gegenseitige Beeinflussung über veraltete DB Daten/Session Daten zu verhindern.
Es kostet natürlich Zeit.. wieviel "Zeit" geht es denn?
 
S

Sym

Gast
Warum willst du den EM/EMF denn cachen bzw. nicht für jeden Test neu erzeugen?

Alles neu erzeugen hat den tollen Nebeneffekt, die Tests wirklich zu separieren und eine gegenseitige Beeinflussung über veraltete DB Daten/Session Daten zu verhindern.
Es kostet natürlich Zeit.. wieviel "Zeit" geht es denn?
Es geht mir gar nicht um die Zeit. Das Problem ist leider, dass die Injection für jede CDI neu geschieht, dadurch habe ich pro Tests ggf. mehrere EM und das ist natürlich nicht so dolle.

In Gänze sieht das bei mir so aus:

Java:
public class EntityManagerMockResource {

	@Produces
	public EntityManager produceEntityManagerMock(final InjectionPoint injectionPoint) {
		final Map<String, String> properties = new HashMap<String, String>();
		properties.put("hibernate.connection.url", "jdbc:h2:target/h2/"
			+ injectionPoint.getMember().getDeclaringClass().getName() + "_"
			+ new BigInteger(30, new SecureRandom()).toString(32) + ";FILE_LOCK=NO");

		final EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitTest", properties);
		return emf.createEntityManager();
	}

}
 
S

Sym

Gast
Die Lösung ist, nicht den EM zu cachen, sondern den EMF. Dann lüppt das. Ich danke euch!
 

Ähnliche Java Themen

Neue Themen


Oben