# Unitname des @PersistenceContext dynamisch beziehen



## Xerxis13 (4. Jan 2011)

Hallo zusammen,

ich wollte hier mal fragen, ob es möglich ist, den Unitname eines @PersistenceContext dynamisch zu beziehen?
Bisheriger Code

```
[..]
	@PersistenceContext(unitName="EKKW_ORACLE11G")
	protected EntityManager entityManager;
	
	public void setEntityManager(EntityManager manager) {
		entityManager = manager;		
	}
[..]
```

Ich habe mehrere persistence-units in der persistence.xml definiert (EKKW_ORACLE11G, EKKW_ORACLE10, EKKW_MYSQL, EKKW_MSSQL, [..])

In der web.xml habe ich durch lesen von Systemumgebungsvariablen auch die persistence-unit-ref-name dynamisch gehalten.

Hat auch so weit alles geklappt, nur leider spuckt mir der hart codierte Entity Manager dabei in die Suppe.

Zum Szenario:
Eine im jBoss5 laufende SEAM Application, mit Hibernate für die Persistence.
Datenbanken "sollen" alle unterstützt werden ("sollen" deshalb, weil wie weiter unten zu lesen, das auch für FAST alle Problemlos klappt durch Hibernate).

Wenn wir an unseren Kunden die Software ausliefern, liefern wir eine fertige .ear Datei mit einem Datasource File aus(in dem die Datenbank Informationen liegen(Name/Passwort/URL/[..]).

An sich kein Problem, hat unser Kunde aber die Option(in naher Zukunft sogar bevorzugt), die Oracle 11g zu nutzen: Und da kommt es zu einem Problem!

An sich schafft es das Hibernate, den richtigen Dialekt für die Datenbank selbst zu wählen,wenn keiner angegeben ist, bis auf für die 11g (https://issues.jboss.org/browse/JBAS-5015).

Wie soll es auch klappen, unterstützt Hibernate die 11g bis heute noch immer nicht(Databases supported by NHibernate - JBoss Community).

Daher muss für die 11g der Dialekt hart gesetzt werden.

Dieses tue ich in der persistence.xml.

Der Kunde bekommt aber wie gesagt nur die .ear Datei, kommt also weder an die persistence.xml, noch an die web.xml dran(ja, ich weiß, es sind nur zips, aber das kommt nicht in Frage).

Um den Bogen zu meiner ursprünglichen Frage zurück zu biegen:
Wie kann ich in der ausgelieferten .class Datei "dynamisch" (externes Config File oder ähnliches) den Unitname beziehen, um im Falle einer Oracle 11 Datenbank auf die richtige persistence Unit zu wechseln?

Das erstellen von 2 Distributionen (Oracle11g Version vs Alle-anderen-Hybernate-unterstützten-DBs-Version) ist auch keine Lösung, die vertrauenerweckend ist.


Ich hoffe mein Problem angemessen beschrieben zu haben und mich nicht irgendwo verrannt zu haben.

Mit freundlichem Gruß,
Patrick


----------



## Deadalus (11. Feb 2011)

Wenn ich das richtig verstanden hab gibt es pro Kunde doch nur eine Datenbank. 

Folglich würde ich den Namen der Unit einfach komplett weglassen: 

Also:

```
@PersistenceContext
protected EntityManager entityManager;
```

In deiner persistence.xml müssen dann halt alle anderen Units auskommentiert werden.


----------

