I want to prepare a custom jparepository save method. In this method I want to compare unmodified and modified entity field values and then update the modified entity based on the comparison.
When I change the blockReason field’s value, In the saveWithCheck method I always read the modified value so that I can’t detect the change that I made previously.
What is the reason that I’m always reading modified value in the line. I expect to read unmodified database entity.
Thanks in advance
existingUserStatus = entityManager.find(UserStatus.class, userStatus.getId());
@Repository
@Slf4j
public class CustomUserStatusRepositoryImpl implements CustomUserStatusRepository {
@PersistenceContext private EntityManager entityManager;
@Override
@Transactional
public UserStatus saveWithCheck(UserStatus userStatus) {
UserStatus existingUserStatus;
if (nonNull(userStatus.getId())) {
log.error("id not null");
existingUserStatus = entityManager.find(UserStatus.class, userStatus.getId());
if (nonNull(existingUserStatus)) {
UserBlockReasonType previousBlockReason = existingUserStatus.getBlockReason();
log.error("Previous block reason: {}", previousBlockReason.name());
UserBlockReasonType newBlockReason = userStatus.getBlockReason();
log.error("New block reason: {}", newBlockReason.name());
if (newBlockReason.equals(UserBlockReasonType.NON)
&& !previousBlockReason.equals(newBlockReason)) {
log.error("setting block reason non set at");
userStatus.setBlockReasonNonSetAt(Instant.now());
}
}
}
if (isNull(userStatus.getId())) {
log.error("persisting user status");
if (userStatus.getBlockReason().equals(UserBlockReasonType.NON)) {
log.error("setting block reason non set at");
userStatus.setBlockReasonNonSetAt(Instant.now());
}
entityManager.persist(userStatus);
} else {
log.error("merge user status");
userStatus = entityManager.merge(userStatus);
}
return userStatus;
}
}
this is th rest of code
@Repository
public interface UserStatusRepository
extends JpaRepository<UserStatus, Long>,
QuerydslPredicateExecutor<UserStatus>,
CustomUserStatusRepository {
Optional<UserStatus> findByUserId(Long userId);
}
public interface CustomUserStatusRepository {
UserStatus saveWithCheck(UserStatus userStatus);
}