如何将UnitOfWork模式与IdentityMap模式一起使用?

问题描述 投票:0回答:1

在Martin Fowler的书中,我读到了UnitOfWorkIdentityMap模式。

作者提到,将IdentityMap放在UnitOfWork内部是个好主意。但是怎么做?

据我所知IdentityMap受会话限制,但作者并未提及UnitOfWork

  1. UnitOfWork实例是否受会话限制?

  2. 假设我们有客户和订单实体。

    public clas Client{
    
         List<Order> orders;
        ...
    }
    

并且我们收到了更新客户信息(电话号码)并添加新订单的请求:

这里需要多少个unitOfWork实例?每个环节?我们应该为客户和订单分开实例吗?

我们在这里需要多少个IdentityMap实例?对于每个实例?我们应该为客户和订单分开实例吗?

每个unitOfWork实例需要多少个IdentityMap实例?

如果我们有2个并发请求怎么办?

java unit-of-work enterprise identity-map
1个回答
0
投票

unitOfWork需要根据您需要管理的业务运营的持续时间来确定范围。如果您的业务操作扩展到多个请求,但需要将其视为单个工作单元,则必须以一致的范围(例如,会话)来处理实例。

工作单元将跟踪与数据库的所有交互,并通过创建事务并以最佳方式进行更改(在短期数据库事务中)来确认它们。

JPA / Hibernate默认情况下实现此模式,因此通常如果您使用它们,则无需自己实现它。JPA / Hibernate还在一级缓存中实现了类似于Identity Map模式的功能(某些例外情况取决于其使用方式)。它将实体映射保存在其一级缓存中,从而避免在会话持续时间和工作单元中向数据库查找多个时间。

正如休眠文档中所说的[read me):

在多用户客户端/服务器应用程序中,最常见的模式是每个请求会话。在此模型中,发送了来自客户端的请求到运行Hibernate持久层的服务器。一个新的Hibernate Session打开,并执行所有数据库操作在这个工作单元中。工作完成后,一旦回应对于已经准备好的客户端,将刷新并关闭会话。使用单个数据库事务处理客户请求,在打开和关闭会话时启动并提交它。的两者之间的关系是一对一的,这个模型是完美的适合许多应用。

因此,您的IdentityMap的范围应与您的业务交易联系在一起,因此应与将跟踪您的业务交易期间所有更改的UnitOfWork的状态联系在一起。

如果您的应用程序处理空交易(例如,每个请求),这将非常简单。如果您有一个跨多个请求的长期工作单元,则unitOfWork必须驻留在会话范围内,并且您的身份映射也已附加在该会话范围内。

在这种情况下,管理数据库中的良好锁定策略以避免发生并发更改的问题(在这种情况下,更容易到达提交时间时,可以修改请求中读取的实体,这是关键。)>

在Java中实现模式的一个基本示例是((不涉及范围问题):https://github.com/iluwatar/java-design-patterns/tree/master/unit-of-work

© www.soinside.com 2019 - 2024. All rights reserved.