Buduje sobie serwis EmployeeManagerService, jedną z składowych tego serwisu jest HibernateSetup (bym do testów mógł użyć bazy hsqlDB, a do odpalania systemy mysqlDB, a przyszłości łatwy sposób podłączyć inne rodzaje persistance unit)
By ułatwić sobie pracę budowaniem klas setup stworzyłem sobie interfejs
public interface iHibernateSetup <T> {
void createPU();
Object getEm();
}
Tam gdzie jest Object wcześniej był typ T. Chwilowo to rozwiązałem, dynamicznym castowaniem na typ. Ale jeszcze tego rozwiązania nie sprawdzałem. Zakładam 3 rozwiązania: zadziała, ale będzie muliło (to nie jest prosty obiekt domenowy), nie zadziała, JVM nie będzie w stanie tego rozwiązać. 3: Memory leak.
Narazie załóżmy, że jest tam typ generyczny.
Intefejs implementuje dla przykładu hsqlDBSetup
public class hsqlDBSetup implements iHibernateSetup<EntityManager> {
private EntityManager em;
public void createPU() {
em = Persistence.createEntityManagerFactory("testPU").createEntityManager();
}
public Object getEm(){
return em;
}
}
Normalnie tam gdzie jest Object jest EntityManager.
No i mam klase setupManager.
public class SetupManager {
public EntityManager getEm(HibernateProperties.typePU hibernateTypePU){
switch(hibernateTypePU){
case hsqlDBPU:{
iHibernateSetup setup = new hsqlDBSetup();
setup.createPU();
return (EntityManager) setup.getEm();
}
case mysqlDBPU:{
return new MysqlSetup();
}
default:{
throw new EnumConstantNotPresentException(HibernateProperties.typePU.class, "Not found type hibernateSetup");
}
}
}
}
I tu przy setupManager w switch na zwrocie castuje pod konkretny typ obiektu. Bez castowania, debug krzyczał że required to EntityManager a dostaje Object, choć w getEm() jasno jest zaznaczone że typ to EntityManager.
Pytanie czy ktos wie jak to rozwiązać. Wcześniej nie bawiłem (powiedzmy świadomie) typami generycznymi.
No i jeszcze wyjście pokaże.
public class ManagerEmployeeService {
private SetupManager setupManager = new SetupManager();
private EntityManager em;
public ManagerEmployeeService (HibernateProperties.typePU typePU){
em = setupManager.getEm(typePU);
}
}