gpt4 book ai didi

java - 无法使用反射从 EJB 内的 Field 转换为 EntityManager

转载 作者:行者123 更新时间:2023-12-01 14:59:01 24 4
gpt4 key购买 nike

我想通过反射在 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 :

Cannot cast from Field to EntityManager

如何将 Field 转换为 EntityManager 对象?

编辑:

我可以通过执行 universe.getName() 获得我的 universe 对象的名称,我将获得 betapretoria .

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

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

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

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

编辑2:

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

最佳答案

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com