运行实体关系树而不是发送特定的DAO查询

时间:2011-06-20 11:03:22

标签: oop seam

如您所知,在Seam中,当读取实体对子对象的引用时,LazyInitializationException没有问题。如果我喜欢在关系树中运行以便读取我需要的数据,而不是向相关实体的DAO发送特定查询,那么有任何问题吗?我是否打破了一些重要的指导/原则?

1 个答案:

答案 0 :(得分:0)

考虑一下这句话:

  

“在Seam中没有LazyInitializationException的问题”

这不是真的。

如果您使用的模式将会话持久保存在长时间运行的对话的边界中,则在接缝中没有LazyInitializationException问题。

这意味着使用Seam注入的持久化上下文,如:

@In
private EntityManager entityManager;

或者,如果您正在使用有状态EJB(也绑定到会话范围):

@PersistenceContext(type = PersistenceContextType.EXTENDED) EntityManager em;
顺便说一句,一旦你理解了这一点,导航关系树就没有问题了。如果你想使用JSF将它绑定到接口,你应该真的这样做。

如果您在返回多个结果的查询中访问ManyToOne或OneToMany关系,请考虑您可能会遇到某些速度问题。这被称为n+1问题,当你基本上为每个返回的记录运行一次往返数据库时。

让我们总结一下:

  • 单个详细信息对象 - >导航关系树
  • 其他对象列表 - >使用左连接提取对DAO进行单个查询。