Jestem w sytuacji, w której muszę określić nazwę jednostki EntityManager w czasie wykonywania.
Na przykład, chciałbym zrobić coś takiego:
@PersistenceContext(unitName = findAppropriateJdbcName())
EntityManager entityManager;
Nie jest to jednak możliwe z adnotacjami.
Czy jest możliwe utworzenie EntityManager, gdy nie jesteś pewien, jaka jest nazwa urządzenia do czasu wykonywania?
Odpowiedzi:
7 dla odpowiedzi № 1Możliwe jest określenie nazwy jednostki trwałości (PU) w środowisku wykonawczym, ale jest to parametr używany podczas tworzenia pliku EntityManagerFactory
nie osoba EntityManager
. Zobacz Javadoc dla Persistence
metoda klasy createEntityManagerFactory()
. Przykład:
EntityManagerFactory emf = Persistence.createEntityManagerFactory(unitname);
EntityManager em = emf.createEntityManager();
// ...
Robię to w aplikacji innej niż Java EE (używając wywołań Java 6 SE w aplikacji internetowej hostowanej przez Tomcat), ale nie jestem pewien, jak to zrobić w zarządzanej przez kontener aplikacji Java EE 6. Jest to możliwe.
3 dla odpowiedzi № 2
W tym miejscu należy ręcznie utworzyć obiekt entityManager bez korzystania z adnotacji za pośrednictwem interfejsu JNDI, aby wskazać go innej, trwałej jednostce w środowisku wykonawczym.
public EntityManager initializeEM(String pUnitName){
Context iCtx = new InitialContext();
String lookUpString = "java:comp/env/persistence/"+pUnitName;
javax.persistence.EntityManager entityManager =
(javax.persistence.EntityManager)iCtx.lookup(lookUpString);
return entityManager;
}