Почему не изменяется состояние обьекта?

class Person {
.....
int digit = 0;
....    
}

....
private static String lastPersonId; // Хранит id последнего измененного Person
....

@Transactional
public void changeState(String personId, int digit) {
    Person person = personRepository.findById(person.getId()).get();
    person.setDigit(digit);
    personRepository.save(person);
}

public void doAction(String personId) {

    if (digitIsIncorrect(lastPersondId)) {
        // движения
    }
    
    // движенния
    changeState(person.getId());
    lastPersonId = personId;
}

public void digitIsIncorrect(String personId) {
    int incorrectNum = 10;
    
    Person person = personRepository.findById(personId).get();
    return person.getDigit() == incorrectNum;
} 

....
junit
.....
public voidTestPerson() {
    Person firstPerson = ....;
    Person secondPerson = ....;
    
}

`

Почему-то при проверке digitIsIncorrect digit не всегда имеет обновленное значение. С чем это может быть связано? Заранее благодарю за ответы.


Ответы (2 шт):

Автор решения: MishaBucha

Ты не задаешь id,если у тебя в entity на аннотации id нет аннотации например:

@GeneratedValue(strategy = GenerationType.AUTO)

то он просто не может сохранить сущность без id.Добавь в сущность на id эту строки и посмотри, заработает ли.

Или у тебя эта строка :

Person person = personRepository.findById(person.getId()).get();

Просто возвращает null, из-за id как раз.

→ Ссылка
Автор решения: Klioda

Возможно просто ошибка в логике обновления поля, убедитесь, что вызываются setDigit и personRepository.save каждый раз, когда вы этого ожидаете, и именно с теми id, которые ожидаете (не перепутаны personId и lastPersondId).

Из того, что имеется:

Приведён код метода changeState(String, int), однако далее вызывается:

changeState(person.getId());

Вызывается другой метод, который не обновляет digit?

Также если действия происходят в разных потоках, то изменения не попадают в базу, например, до завершения транзакции или явного вызова personRepository.flush()

→ Ссылка