【问题标题】:why is not the parameter in persist an output parameter?为什么持久化中的参数不是输出参数?
【发布时间】:2014-02-09 18:46:23
【问题描述】:

这是我得到的:

public User register(User u) {
    em.persist(u);
    System.out.println("USER id: " + u.getIduser()); // INFO: USER id: 0
    em.flush();
    System.out.println("USER id: " + u.getIduser()); // INFO: USER id: 1
    return u;
}

即使我省略了对 flush() 的调用,尽管用户 is 仍然存在于数据库中(MySQL,我使用来自 eclipse 的 glasssfish 4)。那么为什么我需要调用flush来设置id(它显然是在方法退出时自动调用的,但说我想在register()中使用id)?

顺便说一句,flush() 被调用的事实是否表明事务正在进行?

更新:这是 EJB 类:

@Stateless
public class UserService {

    @PersistenceContext
    private EntityManager em;

    public User register(User u) {
        em.persist(u);
        // em.flush(); // not needed - called on exit - maybe I have a
        // transaction after all
        return u;
    }
}

【问题讨论】:

  • UserService 从@ManagedBean @ViewScoped public class UserController { @EJB private UserService service; } 调用。最后我想标题问题的答案是persist()需要是异步的。

标签: jpa entitymanager flush


【解决方案1】:

如果你检查the documentation for EntityManager你可以看到。

无效刷新()

将持久化上下文同步到底层数据库。

Persist() 不会刷新您的实体,但它会对数据库执行操作。

要获取您的 id,您必须同步您的实体。

AFAIR flush() 与交易无关。由于 JTA 管理您的交易。 JTA 从 EntityTransaction 调用方法 begin、commit、rollback,由 EntityManager.getTransaction() 返回。

如果您在实体上调用 EntityManager.refresh 方法,它也应该被同步。

编辑

每个 EJB 都由 Java EE 容器管理。您刚刚注意到了这种管理的效果。每个方法调用都在事务中,并且可能也与此同步。

要了解发生这种情况的原因,您可以致电:

Thread.currentThread().getStackTrace()

在您的 UserService.register 中,打印堆栈跟踪元素的完整数组。你会得到类似的东西:

UserService.register(UserService.java:xxx)
SomeGenerated.invoke(SomeGenerated.java:xxx)
SomeGenerated.invoke(SomeGenerated.java:xxx)
UserController.register(UserController.java:xxx)

因此,您不会像预期的那样直接从 UserController.register 调用 UserService.register 方法。

这个“SomeGenerated”类负责为您提供 EJB 的合同。例如,他们关心事务,并且可能在您的情况下也关心与数据库的同步实体。

【讨论】:

  • 如果我只是做em.persist(u);return u;,那么我返回的u 具有正确的ID - 所以在方法返回时会调用flushrefresh。我用课堂上的注释编辑了问题 - 我在 UserService .register() 上是否有事务正在运行? (虽然我的问题是为什么坚持不刷新我会满意如何:)
  • 谢谢 - 我已经看到堆栈跟踪和 __Generated_ 而无需调用 Thread.currentThread().getStackTrace()(笑话),但你的回答是有道理的 :)。为了完美起见,我想要一些指向此同步文档的链接。 @stateless 对交易有影响吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多