gpt4 book ai didi

jpa+ejb 如何为多个请求保持实体附加(托管)?

转载 作者:行者123 更新时间:2023-12-04 02:32:08 24 4
gpt4 key购买 nike

这是我到目前为止尝试过的。

我对我的单例提出了 2 个请求。第一个请求由方法 firstRequest 处理,它会更改数据库。第二个请求由方法 secondRequest 处理,但它不会更改数据库。

@Singleton
public class App{

@Inject DaoHuman daoHuman;
Human human;

public void firstRequest(){
human= daoHuman.findById(1);
human.setAge(3);
}

public void secondRequest(){
human.setAge(99);
}

@Stateful
public class DaoHuman{
@PersistenceContext(unitName = "myPU", type=PersistenceContextType.EXTENDED)
private EntityManager em;

我的问题是实体在第一次请求后变得分离(非托管)。所以它永远不会收到第二个请求。

最佳答案

您有一个为有状态 session Bean 定义的扩展持久性上下文,并且确实在 daoHuman.findById(1) 之后(此代码未显示,但我假设它是 em。 find(Humand.class, id)) 被调用时,Id=1 的人将成为托管实体并由扩展持久性上下文跟踪。

此外,因为您有一个Extended持久性上下文,这个上下文将在有状态 session Bean 的生命周期内持续存在,并且人类实体将在多个客户端调用(对话)期间保持受管理状态。 p>

这一切都很好。但是,您的 Singleton 是无状态的,因此当您发出第二个请求时,human 不会被初始化。

您还必须牢记,只有在调用定义了 EntityManager 的有状态 session Bean 时,您的扩展持久性上下文才会与当前事务相关联。 secondRequest() 不会发生这种情况,因此当事务完成时,不会将持久性上下文刷新/持久化到数据库。

跨多个调用使用托管实例的一种简单方法是在首次初始化 bean 时将实体存储在有状态 session Bean 实例上。我在下面的代码中为您保留了单例/有状态 session bean 结构。根据要求,我很想对 session bean 进行实体更新。

@Singleton
public class App{

@Inject DaoHuman daoHuman;
Human human;

Public void init(int humanId){
daoHuman.init(humanId);
}

public void firstRequest(){
// Making the call to daoHuman.getHuman() both returns the mnaged entity and
// causes the persistence context to be associated with the current
// transation, so when this method call ends, the context will be
// Depending on requirementsflushed/committed.
human= daoHuman.getHuman();
human.setAge(3);
}

public void secondRequest(){
human= daoHuman.getHuman();
human.setAge(99);
}

@Stateful
public class DaoHuman{
@PersistenceContext(unitName = "myPU", type=PersistenceContextType.EXTENDED)
private EntityManager em;
Human human;

public void Init(int humanId){
// em.find() will ensure the found entity becomes managed - part of the
// persistene context, placing it on the instance variable ensures
// the managed entity is available over multple client invocatons (converstion)
human = em.find(Human.class, humanId)
}
public Human getHuman(){
return human;
}

关于jpa+ejb 如何为多个请求保持实体附加(托管)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31224653/

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