0

我想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

无法从 Field 转换为 EntityManager

Field请问我该如何投EntityManager反对票?

编辑 :

我可以universe通过做我的对象的名称,universe.getName()我会得到betaor pretoria

我知道我可以使用 getter 来检索正确的 EM:

if(universe.getName().equals("beta"))
   return emBeta;
else
   ...

但是我的 EJB 中的 EM 数量可能会增加。因此,通过反射,代码会变慢(但每个用户在注册时只会使用一次),但是当我添加新的 EM 时我不必更改它。这就是为什么我不使用吸气剂。

在我的情况下使用反射有什么缺点吗?

编辑2:

我检索到的 EM 的交易完整性会丢失吗?

4

2 回答 2

1

您应该提供包含您需要获取的字段的对象:

boolean isAccessible = field.isAccessible();
try {
    field.setAccessible(true);
    return field.get(this); // <-- pass object instance here
} finally {
    field.setAccessible(isAccessible);
}
于 2012-12-19T16:40:26.223 回答
0

您不能将 Field 强制转换为 EntityManager,因为它们不在同一个类层次结构中。您真正想要做的是将 Field 的作为EntityManager

field.setAccessible(true);
final EntityManager manager = (EntityManager) field.get(universe);

上面的代码向您展示了如何执行此操作,但我强烈建议您不要使用这种方法。当您可以在 Context 对象上创建一个 getter 并以这种方式返回它时,为什么需要通过反射获取实体管理器?我建议不要使用反射的原因是因为您的实体 bean 将由您的应用程序容器代理,并且使用反射可能不会产生您期望的结果。

于 2012-12-19T16:39:47.753 回答