我想通过反射在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()
对象的名称,然后将得到beta
或pretoria
。我知道我可以使用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/