Сущность с состоянием не должна переопределять equals, то есть сущности должны сравниваться на равенство по ссылочной идентичности, поэтому List.contains не будет работать так, как вы хотите.
Я использую отражение, чтобы сравнить поля исходных и перезагруженных объектов. Функция, которая проходит по полям объектов, игнорирует переходные поля и поля, помеченные как @ Transient.
Мне не нужно игнорировать идентификатор. Когда объект впервые сбрасывается в базу данных, Hibernate назначает ему идентификатор. Когда он будет перезагружен, объект будет иметь тот же идентификатор.
Недостаток вашего теста в том, что вы не установили границы транзакции. Вам необходимо сохранить объекты в одной транзакции. Когда вы фиксируете эту транзакцию, Hibernate сбрасывает объекты в базу данных и выделяет их идентификаторы. Затем в другой транзакции загрузите объекты обратно из базы данных. Вы получите другой набор объектов, которые должны иметь одинаковые идентификаторы и постоянное (то есть не переходное) состояние.