gpt4 book ai didi

java - 为什么我的@ApplicationScope CDI bean 没有更新?

转载 作者:行者123 更新时间:2023-11-29 09:17:54 26 4
gpt4 key购买 nike

在我的应用程序中,我有一个 @ApplicationScoped CDI bean 来存储来自数据库的一些信息:

@Named
@ApplicationScoped
public class MrBean {
@EJB
private SoyaBean soyaBean;
private List<Toys> myToys;

@PostConstruct
public void prepareMrBean() {
this.myToys = soyaBean.getToys();
}

public void updateToys() {
this.myToys = soyaBean.getToys();
}
}

我还有一个 AddToy.xhtml 页面,它可以简单地将一个玩具添加到数据库中。支持bean如下:

@Named
@RequestScoped
public class MrsBean {
@EJB
private SoyaBean soyaBean;
@Inject
private MrBean mrBean;

public void addToy() {
this.soyaBean.addToy();
this.mrBean.updateToys();
}
}

由于数据库中添加了一个新玩具,我想更新 mrBean 中的玩具列表。然而,即使 mrsBean 调用了 mrBean.updateToys(),mrBean 中的玩具列表也根本没有更新。我有另一个带有 @RequestScoped 支持 bean 的 ViewToys.xhtml 来查看玩具列表,但我没有看到列表得到更新。

如果有人能就如何解决这个问题给我建议,我将不胜感激。

更新:这是我的 SoyaBean 实现:

@Stateless
public class SoyaBeanImpl implements SoyaBean {
@PersistenceContext()
private EntityManager em;

@Override
public List<Toys> getToys() {
Query q = em.createQuery("SELECT T from Toys T");
return (List<Toys>) q.getResultList();
}

@Override
public void addToy() {
Toys newToy = new Toys();
em.persist(newToy);
}
}

UPDATE 2 如果有人能向我展示如何以除我的麻烦方式以外的任何方式实现相同的目标,我也将不胜感激。

最好的问候,

詹姆斯陈

最佳答案

假设您的代码中没有重大技术错误,正如您所暗示的那样,这些错误通常与实体管理器返回的数据状态有关。

Cluprit:数据库?

当然,您可能在底层数据库中遇到缓存问题。但是,鉴于您对 system.out 语句的描述,这不太可能。

罪魁祸首: bean ?

更可能的罪魁祸首是查询结果以某种方式缓存在 bean 中,或者更确切地说,缓存在查询结果集返回值中。如果您的测试数据库允许脏读,那可能是一种解释。这可以通过例如在任何调用 getToys() 之前使用 @Interceptor 刷新查询来检查。

这里的另一个潜在陷阱:将无状态与缓存混淆。

最后:简单介绍一下无状态。虽然您认为 bean 的无状态应该导致正确,但一般来说,数据不是陈旧的——但情况并非总是如此。 EJB 上下文中无状态 bean 的真正定义是,这些 bean 不能保证在应用程序生命周期的过程中具有状态。

总而言之,有 3 种不同的方法可以深入了解您的问题:

1) 确保数据库没有对脏读做任何有趣的事情。2) 测试拦截getToys()调用,运行/验证数据库查询是否有问题3) 确保您想要的无状态类型实际上由您的 ejb 容器实现。

关于java - 为什么我的@ApplicationScope CDI bean 没有更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8376652/

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