EntityManager
リフレクションを使用してEJBを動的に取得したいと思います。私はこのコードを持っています:
@Stateful
@Local(ContextLocal.class)
public class ContextBean implements ContextLocal {
@PersistenceContext(unitName="00")
private EntityManager emBeta;
@PersistenceContext(unitName="01")
private EntityManager emPretoria;
private static Logger logger = Logger.getLogger(ContextBean.class);
public ContextBean() {}
@Override
public void createAccount(String pseudo, char[] password, String email, TemperamentEnum temperament, Universe universe, int galaxie, int solarSystem, int position) throws PSQLException {
// Récupération de l'EntityManager adequat en fonction de l'univers choisi
EntityManager em = getEmFromUniverse(universe);
}
/**
* retourne un EntityManager en fonction d'un univers donné
*
* @param universe
*
* @return EntityManager
*/
private EntityManager getEmFromUniverse(Universe universe){
EntityManager em = null;
try {
Field[] fields = Class.forName(getClass().getPackage() + "ContextBean").getDeclaredFields();
for(Field field : fields){
if(!field.getType().equals(EntityManager.class))
continue;
if(field.getName().replaceFirst("^em", "").equalsIgnoreCase(universe.getName()))
return (EntityManager)field; // ERROR HERE
}
} catch (SecurityException e) {
logger.log(Level.FATAL, e);
} catch (ClassNotFoundException e) {
logger.log(Level.FATAL, e);
}
return em;
}
}
キャストできませField
んEntityManager
:
フィールドからEntityManagerにキャストできません
どうすればオブジェクトにキャストできField
ますEntityManager
か?
編集 :
universe
を実行することでオブジェクトの名前を取得でき、またはuniverse.getName()
を取得します。beta
pretoria
ゲッターを使用して適切なEMを取得できることはわかっています。
if(universe.getName().equals("beta"))
return emBeta;
else
...
ただし、EJB内のEMの数はおそらく増えるでしょう。したがって、リフレクションを使用すると、コードは遅くなります(ただし、登録時にユーザーごとに1回だけ使用されます)が、新しいEMを追加するときにコードを変更する必要はありません。だから私はゲッターを使いません。
私の場合、リフレクションを使用することの欠点はありますか?
EDIT2:
取得したEMのトランザクションの整合性が失われる可能性はありますか?