Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解JPA、EJB3和Web服务_Java_Web Services_Jpa_Jakarta Ee_Ejb 3.0 - Fatal编程技术网

Java 理解JPA、EJB3和Web服务

Java 理解JPA、EJB3和Web服务,java,web-services,jpa,jakarta-ee,ejb-3.0,Java,Web Services,Jpa,Jakarta Ee,Ejb 3.0,我刚刚开始使用JPA,从JPA实体创建无状态会话bean,然后通过web服务访问bean。虽然我有很多“老办法”开发数据库支持的web服务的经验,但对于这种新的“注释驱动方法”的幕后运作,我有一些疑问 我看到的是,NetBeans通过其向导引导您以这种方式构建应用程序 使用EJB和Web应用程序模块创建企业应用程序 创建实体类。我从现有的数据库创建了我的 从实体类创建会话bean 从会话bean创建Web服务 这一切看起来都很简单,但幕后发生了什么?具体而言: 我看到web服务(使用@WebSe

我刚刚开始使用JPA,从JPA实体创建无状态会话bean,然后通过web服务访问bean。虽然我有很多“老办法”开发数据库支持的web服务的经验,但对于这种新的“注释驱动方法”的幕后运作,我有一些疑问

我看到的是,NetBeans通过其向导引导您以这种方式构建应用程序

  • 使用EJB和Web应用程序模块创建企业应用程序
  • 创建实体类。我从现有的数据库创建了我的
  • 从实体类创建会话bean
  • 从会话bean创建Web服务
  • 这一切看起来都很简单,但幕后发生了什么?具体而言:

  • 我看到web服务(使用
    @WebService
    注释创建)引用了我的无状态会话bean(使用
    @EJB
    引用)。
    • 这里发生了什么?它只是从应用服务器的EJB池中获取EJB实例吗?
      没有关系。我正在考虑一个实例,其中有不止一个表,这意味着不止一种类型的实体类和不止一种类型的EJB。我正在查看web服务,只是看到了
      @EJB
      引用,不知道它从该注释中得到了bean类型。然而,就在它下面,它是对本地bean接口的引用——就是这样
    • 如果服务器上部署了不止一种类型的EJB,那么它如何知道应该获取哪一种
  • EJB是通过
    @无状态
    @本地
    注释定义的。bean实现通过
    @PersistenceContext
    注释引用
    EnityManager
    • 数据库的jndi查找在哪里完成(可能在
      persistence.xml
      文件中)
    • 所有EJB是否共享一个公共的
      EntityManager
      (假设
      EntityManager
      是线程安全的)?如果没有,我知道
      EnityManager
      使用二级缓存来帮助减少对数据库的访问,这些缓存是否以某种方式保持同步
  • 我知道这有很多问题,但它们都是相关的,似乎有很多复杂的概念,通过向导很容易构建。我想确保我了解这里发生的一切

    提前谢谢

    这里发生了什么?它是否只是从应用服务器的EJB池中获取EJB实例

    JAX-WSWeb组件端点(与JAX-WSEJB端点相反)遵循典型的servlet线程模型,这意味着通常每个客户端都有一个并发执行的实例。JAX-WS实现可以自由地利用bean实例池,以类似于无状态会话EJB组件的方式处理请求。(来源:为JavaTM EE平台FJ-310开发应用程序)

    在所有情况下,注入/查找无状态bean都是可以的,因为容器保证bean始终是线程安全的。实际上,容器会自动序列化客户端调用,但会使用实例池来确保您仍然获得并发优势

    如果服务器上部署了多个EJB,那么它如何知道要获取哪个EJB

    嗯。。。我没有得到这个。你能澄清你的确切意思吗?为什么会有任何歧义

    数据库的jndi查找在哪里完成(可能在persistence.xml文件中)

    在Java EE环境中,在
    persistence.xml
    文件的每个持久化单元中的
    元素中指定数据源(可以包含多个持久化单元),并且数据源将由
    EntityManager
    获取(仅在需要时,即仅当确实需要数据访问时)

    所有EJB是否共享一个公共的
    EntityManager


    否。
    EntityManager
    是一个非线程安全的对象,对于单个业务流程、单个工作单元,应该使用一次,然后丢弃。在使用EJB3的JavaEE环境中,默认模式是“每个请求的entitymanager”。来自客户端的请求被发送到EJB3持久层,一个新的
    EntityManager
    被打开,所有的数据库操作都在这个工作单元中执行。一旦工作完成(并且客户机的响应已经准备好),持久性上下文以及实体管理器对象将被刷新和关闭。(来源:)。

    答案太棒了!谢谢你,帕斯卡。看起来你可能在这里引用了一些资料(斜体文本?)。你能给我一个链接吗?谢谢@Vinnie我的网站(大概吧?)太慢了,昨天我放弃了添加参考资料。但现在已经完成了。