我想通过反射在EJB中动态获取EntityManager。我有这个代码:

    @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()对象的名称,然后将得到betapretoria

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

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


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

在我的案例中使用反射有什么缺点吗?

编辑2:

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

最佳答案

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

boolean isAccessible = field.isAccessible();
try {
    field.setAccessible(true);
    return field.get(this); // <-- pass object instance here
} finally {
    field.setAccessible(isAccessible);
}

关于java - 无法使用反射将字段从Field强制转换为EJB内的EntityManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13956592/

10-11 01:12