栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

EJB:在PostConstruct方法中使用EntityManager

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

EJB:在PostConstruct方法中使用EntityManager

有人知道,为什么它在PostConstruct方法中不起作用?

原因1
您不能创建同时具有@Stateful和@Singleton的bean(可以,但是没有意义,因为Singletons也是有状态的),这是您遇到麻烦的原因之一。没有例外,但是那里有冲突,您需要先解决它。

只记得:

  • Singleton bean是保持其状态的bean。应用程序中只有一个Singleton实例,并且该实例在该应用程序的所有用户之间共享。同样,由于它是一个共享的(最好是并发的)bean,因此需要使用@Lock注释实现某种锁定机制。

  • 有状态bean是在事务处理后保持每个状态的bean。使用
    有状态Bean时,每个用户都将获得该Bean的副本,副本将持续到会话为止-持续或直到调用@Remove注释的方法为止

原因2 即使成功,您也将无法访问结果,因为您将结果存储在名为res的对象中,该对象只能从 init()
方法内部进行访问。我想您想将返回的值分配给变量 priceSteps

无论如何,您的代码中有很多事情是错误的,因为没有说明一切。我不知道您的系统要求是什么,但是在这里,我将为您提供一个简单的解决方案,使您可以访问数据库:

我想您正在尝试以某种方式在Bean的生命周期中返回数据,因为如果Bean是 @Stateful,
您要避免一次又一次地发送查询。事实是,您不必这样做,您仍然可以使bean @Stateless 并避免使用许多查询来给数据库 施加
压力。您需要做的是创建一个 @NamedQuery

因此,使用 @NamedQuery 注释您的实体 PriceStep ,然后在其中输入您编写的查询字符串。在此链接中,您将找到有关如何使用
@NamedQueries的信息
:http :
//docs.oracle.com/cd/B31017_01/web.1013/b28221/ent30qry001.htm


****

接下来的事情我会建议你是来注释类 PriceManagementBean* @Stateless
***。不必担心是否在每个请求中都创建了一个新的entityManager,它根本不会对数据库造成压力,因为它与域模型进行了交互。您不需要@PostConstruct,只需在需要时调用@NamedQuery即可。应用服务器将对其进行缓存,并将其发还给需要它的每个用户,而无需一直与数据库进行交互。

这是一个代码片段:

@Entity@NamedQuery(    name="allPriceSteps",    queryString="SELECt ps FROM PriceStep ps")public class PriceStep implements Serializable {...}

现在豆:

@Statelesspublic class PriceManagementBean implements PriceManagement {    @PersistenceContext    private EntityManager em;    public List<PriceStep> getAllPriceSteps() {         Query query =  em.createNamedQuery("allPriceSteps");         return query.getResultList();     }}

我希望这是有用的。如果您提供有关系统要求的更多信息,我们可以为您提供最佳实践建议。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/415800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号