代码之家  ›  专栏  ›  技术社区  ›  kgrad

我是否正确使用ejb?

  •  2
  • kgrad  · 技术社区  · 16 年前

    我正在使用一个jee6堆栈,包括jpa 2.0、jsf2.0、ejb 3.1等。

    我的体系结构的设置方式如下:

    我用hibernate作为jpa提供者,用jpa注释dao。 我有jsf管理的bean,它们对应于我的facelet/xhtml页面。 我有处理所有数据库请求的ejb。

    我的xhtml页面有jsf el,它调用我的托管bean。我的托管bean包含对由ejb管理的dao实体的引用。例如,我有一个映射到db表的用户实体。我有一个用户ejb,它处理返回用户的所有crud操作。我有一个编辑用户的页面。高级工作流是:导航到用户编辑页->el调用位于加载用户的托管bean中的方法。该方法从ejb调用userejb.loaduser(user)从数据库中获取用户。用户被编辑并提交->在托管bean中调用函数,该bean调用ejb中的函数来保存用户。等。

    使用ejb访问jsf页面中的数据时遇到问题。 我有很多问题与懒惰的初始化错误,我相信这是由于我如何设置的事情。

    例如,我有一个客户机实体,它有一个用户列表,这些用户被延迟加载。为了得到 我在ejb中调用一个方法的客户端,该方法进入数据库,找到一个客户端并返回它。后来 我希望访问这个客户机用户列表,为此,我必须通过调用某种方法返回到ejb,以便加载这些用户(因为它们是惰性加载的)。这意味着我必须创建一个方法,比如

    public List<User> getUserListByClient(Client c)
    {
        c = em.merge(c); return c.getUserList();
    }
    

    这种方法的唯一目的是加载用户(我甚至不确定这种方法是好的还是有效的)。 如果我自己做会话管理,我想让会话对整个请求保持打开状态并直接访问属性,这很好,因为会话无论如何都是打开的,ejb中似乎还有一个额外的间接层,这使我很难处理。

    我确实喜欢ejb,因为我喜欢它们由容器控制、池控制、免费提供事务管理等。但是,我感觉到我使用它们不正确,或者我设置的jsf应用程序不正确。

    任何反馈都将非常感谢。

    谢谢,

    2 回复  |  直到 16 年前
        1
  •  1
  •   nash    16 年前

    你的用法似乎不错。请记住,em.merge(c)可能会将对客户机c所做的更改保存到数据库中。如果只想获取客户端C的用户列表而不保存对客户端C所做的更改,则可以执行以下操作:

    public List<User> getUserListByClient(Client c)
    {
    
         Client client = em.find(Client.class, c.clientId);
         return client.getUserList();
    
    }
    

    或者更好的方法是,只需将客户机ID发送到getuserlistbyclient,而不是传递完整的客户机对象,只需保存少量的winsy内存:)

        2
  •  2
  •   Community Mohan Dere    9 年前

    如果我在做会话管理 我自己,我想离开 整个请求的会话打开 直接进入酒店,这个 会很好的 无论如何打开

    的确,那是 open session in view 模式(在视图中也称为open entitymanager)。它也可以与ejb一起使用。理想情况下,事务应该在业务层/ejb中管理,这样就可以看到与纯层体系结构的轻微偏差。但它解决了视图中的延迟加载问题,而且很容易实现。

    否则,您必须确保急切地加载事务结束后将使用的信息。或者你可以依赖DTO,但是它开始变得很麻烦。

    下面是另外两个链接,它们涵盖了该主题并讨论了优缺点和备选方案: