1

Service facades are usually implemented as stateless session beans, which means that any entities they possibly return will be detached immediately. This makes me think that any entity returned as a result of a service facade business method should eagerly fetch all of its internals, as in the absence of eager fetching, its internals cannot be accessed by service clients. I want to know whether I'm right on this and whether there is possibly any other way which may be more appropriate in certain circumstances.

Thank you

4

1 回答 1

2

是的,您基本上是对的,一旦实体从创建它们或从数据库中获取它们的会话 bean 方法返回,它们就会被分离。这意味着在客户端层无法访问延迟加载的相关实体。根据我的工作经验,我可以说有两种常见的情况。第一个是业务层中的数据模型,用实体和企业 bean 实现,与客户端层中使用的数据模型完全不同;在这种情况下,最好的解决方案是创建所谓的 DTO(数据传输对象),即带有 get 和 set 方法的普通 java 对象,并使用它们在两层之间传输数据。这种方法的主要缺点是编写 DTO 可能会很长,无聊且容易出错的任务,而且它们要么不实现业务逻辑,要么是纯 bean,要么逻辑必须在两个层中复制。如果两层中的数据模型相同并且一个会重用行为,则尤其如此。这导致我们采用第二种方法,即构建一个独特的数据模型,其中包含要在业务层和客户端层共享的实体,具有更少的代码编写和逻辑重用的明显优势。但是,为了将分离的实体从一层传递到另一层,您只有两个选择:要么将所有关系声明为急切,有可能在内存中加载太多对象,尤其是当您的实体紧密互连时,或者让它们懒惰并编写您的外观方法要小心,以便在返回之前加载所有需要的字段。我'

于 2012-11-25T14:43:38.167 回答