У меня есть класс JPA @Entity
. Я извлекаю объект, используя один из методов jpa findBy
который JPA
будет рассматривать в persistent state
, затем я обновляю некоторые из полей в сущности, а затем передаю объект для проверки. Если проверка не удалась, не обновляйте, если проверка завершается успешно, а затем сохраняйте объект.
Вот основная проблема с этим потоком: поскольку я обновил объект для его использования в валидации, неважно, буду ли я вызывать save()
, запись всегда будет обновляться, поскольку JPA обнаруживает, что объект был изменен и флаги для обновления.
Как избежать такого поведения?
Класс My Entity
@Entity
@Table( name = "user" )
@Data
@EqualsAndHashCode( of = { "id" } )
@ToString( of = { "id" } )
public class UserModel {
@Id
@GeneratedValue( strategy = GenerationType.AUTO )
@Column( name = "u_id" )
private Long id;
@Column( name = "u_first_name" )
private String firstName;
@Column( name = "u_last_name" )
private String lastName;
@Column( name = "u_email_id" )
private String emailId;
@Column( name = "u_password" )
private String password;
@Column( name = "u_mobile_number" )
private String mobileNumber;
@Column( name = "u_created_at" )
private Calendar createdAt;
@Column( name = "u_is_active" )
private Boolean isActive;
}
Я вижу два варианта:
Когда валидация не удаляет объект из EntityManager
.
Убедитесь, что вы используете соответствующие каскадные аннотации или вручную перебираете все объекты, которым требуется отсоединить.
@Transactional
все обновление и проверку в отдельном режиме, то есть в методе без аннотации @Transactional
. Таким образом, только когда вы явно вызываете сохранение, информация будет сохранена.
Это может быть немного просто, чтобы получить право, но имеет недостаток загрузки всех затронутых объектов дважды.