首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >作业是否共享EntityManagers - Play!框架

作业是否共享EntityManagers - Play!框架
EN

Stack Overflow用户
提问于 2012-03-24 17:43:09
回答 1查看 669关注 0票数 3

假设我有三个作业正在运行,其中两个是相同的……所以:

代码语言:javascript
运行
AI代码解释
复制
CrawlJob job1 = new CrawlJob();
CrawlJob job2 = new CrawlJob();
CurrentJob job3 = new CurrentJob();
job1.now()
job2.now()
job3.now()

如果我在job1中执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
JPA.em().flush();
JPA.em().clear();

这是否也会分离job2和job3当前正在处理的所有实体?这意味着,如果我在数据库中查找的job2/job3中传递一个entity/Model对象,job2/job3是否容易中断,因为该对象刚刚从会话中分离出来?

同样,假设我在job1中执行以下操作:

代码语言:javascript
运行
AI代码解释
复制
long id = 123
User user1 = new User(id);
user1.save();

然后在job2或job3中我这样做:

代码语言:javascript
运行
AI代码解释
复制
User user2 = User.findById(id);

user2是等于"null“还是等于"user1"?这意味着,即使user1还没有被刷新/提交到数据库,job2或job3是否能够通过Id来查找它?

我认为这两个问题的意思是,作业(不管它们是相同作业的实例化还是不同作业的实例化)是否共享EntityManagers,因此.em().flush()、.em().clear()或.em().getTransaction().commit()或Model.save()将同时影响所有作业?

EN

回答 1

Stack Overflow用户

发布于 2012-03-25 12:27:08

作业开始它们自己的jpa事务,而您的实体在事务完成之前实际上不会被持久化。

因此,除非作业1在job2加载实体时完成,否则job2不会看到job1所做的更改。

如果您想要在jobs1仍在运行时提交数据,您可以在job1中提交事务,然后使用如下代码启动一个新事务:

代码语言:javascript
运行
AI代码解释
复制
    JPA.em().getTransaction().commit();
    JPA.em().getTransaction().begin();
    JPA.em().flush();
    JPA.em().clear();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9853968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档