Когда вы извлекаете данные из кэша по id (getOrderItemById), я предполагаю, что это означает «получить объект , уникально идентифицированный по id =?». Во втором отрывке у вас есть (или вы пытаетесь иметь?) 2 разных объекта, поэтому похоже, что вы пытаетесь сделать 2 противоречивые вещи в коде.
Вы можете применить уникальность-Id = "ID" всегда один и тот же объект. Если вы устанавливаете статус, а затем сбрасываете его, это означает, что тот же объект имеет новый статус. Возможно, вы захотите расширить метод .equals, чтобы он возвращал true, если идентификатор также совпадает.
Вы также можете использовать «грязный» флаг, чтобы пометить объекты, которые были изменены из (транзакционного?) Хранилища данных.
Создание копии тоже неплохой способ справиться с этим, хотя неясно, что значит иметь 2 объекта, бегающих с одинаковым идентификатором. Может быть, копия должна быть создана с нулевым идентификатором, чтобы указать, что она еще не существует в кэше?
Какое поведение подходит для вашего приложения?