我是 JPA 的新手,我无法理解无状态和有状态之间的用途和区别。
有什么经验吗?
问候, 海瑟姆
Stateless和Stateful是 EJB Session Bean 的概念,而不是JPA的概念。
注意: JPA 是 EJB 规范的一部分,但可以在 EJB 容器之外单独使用。这通常是造成混乱的原因。
编辑:一个有用的 SO 线程,Why Use Stateful Session Beans。
“有状态”和“无状态”是会话 bean 的属性。
会话 bean(简而言之)提供了一种调用应用程序服务器上的方法的方法。bean 是 java 类的一个实例。通常,bean 在远程方法终止(并返回结果)后被销毁。那些bean是“无状态的”。
可以(但不常见)向 bean 添加字段和属性,以便客户端可以在服务器上“创建”此实例并将其用于多个操作。这些 bean 是“有状态的”(应该避免)。
有状态和无状态是EJB(Java EE 容器管理的会话 Bean)的属性,而不是特定于 JPA 规范的任何属性。对于来自同一客户端的每个请求,有状态bean 将具有与之关联的状态。无状态bean 没有特定于客户端的状态,并且单个实例可以在多个客户端请求之间并发、线程安全地使用。
JPA 是一种可用于持久化有状态 bean 的持久性策略(我猜您也可以直接使用 JDBC,或者插入其他一些持久性策略)。
我认为部分困惑在于 Java Persistence API 是 EJB3 规范的一部分,有时似乎可以与 EJB 互换使用。直到我第一次拿起Pro EJB 3: Java Persistence API之前,我才真正理解这一点。看看http://en.wikipedia.org/wiki/Enterprise_JavaBean它似乎提供了关于这个主题的一个很好的概述。
基本上,如您所知,Java 会编译一些东西,然后如果在类加载器之后一切顺利并避免执行阶段错误等等,当您在 RAM 等任何地方存储变量、对象等时,您会在运行时看到应用程序或者当用户与您的应用程序交互时,数据库和这些数据可能会发生变化,那么您开发了一个有状态的应用程序,如果您认为代码逻辑中没有什么是动态的(可以重塑应用程序行为的东西),那么您将要开发一个无状态应用。
简而言之,有状态的应用程序意味着在运行时你的类属性的动态变化。