Как получить данные перед фиксацией в Spring Data JPA?

Я сохраняю две сущности, связанные друг с другом. После этого я могу получить первую сущность, но получаю исключение NullPointerException, когда пытаюсь получить вторую сущность из первой сущности. Вот пример:

@Entity
@Table(name = "PARAMETRIZACION")
public class Parametrizacion {

    @Id
    @Column(name = "id_param", unique = true, nullable = false)
    private Integer idParam;

    @OneToMany(fetch = FetchType.LAZY)
    private List<Arreglo> listArreglo;
}

А также

@Entity
@Table(name = "ARREGLO")
public class Arreglo {
    @Id
    @Column(name = "id_arreglo", unique = true, nullable = false)
    private Integer idArreglo;
}

И моя служба:

@Service
@Repository
public class TestServiceImpl implements TestService {

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void methodTest(){
        ...
        parametrizacionRepository.saveAndFlush(parametrizacion);//Id=1
        ...
        arregloRepository.saveAndFlush(listArreglo);//Id=1

        Parametrizacion paramFetch = parametrizacionRepository.findById(1);
        Log.info("Param.Id = " + paramFetch.getIdParam());
        Log.info("Size = " + paramFetch.getListArreglo().size());
    }
}

Результат для первого журнала: Param.Id = 1 Результат для второго журнала: NullPointerException

Как я могу получить полную сущность, включая его детей? Только если я сделаю этот запрос после транзакции фиксации, я могу получить данные, но мне нужно сохранить данные, обновить данные и найти данные, прежде чем совершить транзакцию по завершении транзакции.

Вы пробовали использовать @OneToMany(fetch=FetchType.EAGER) в коллекции вместо @OneToMany(fetch=FetchType.LAZY)?

ITWorker 21.03.2018 02:15

Я так не думаю, потому что если я выполняю find () после comit, я имею в виду, что в другой транзакции я могу получить все данные, отца и ребенка.

omargja 21.03.2018 03:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
240
2

Ответы 2

Может быть проблема с однонаправленным отношением. Попробуйте добавить поле @ManyToOne в класс Arreglo и объявите, как они должны совпадать, добавив mappedBy = "" в аннотацию @OneToMany.

Вот несколько хороших примеров того, как должны выглядеть отношения: https://en.wikibooks.org/wiki/Java_Persistence/OneToMany

Я так не думаю, потому что если я выполняю find () после comit, я имею в виду, что в другой транзакции я могу получить все данные, отца и ребенка.

omargja 21.03.2018 03:40

Вы сохраняете параметризацию и listArreglo отдельно. И это не устанавливает никакой связи для параметризации с Arreglo. Вы должны установить listArreglo для параметризации переменной listArreglo и сохранить только параметризацию.

Я знаю, что это лучший способ сделать это, но у меня есть бизнес-правила, которые не позволяют мне делать это таким образом. Спасибо за вашу помощь.

omargja 21.03.2018 18:04

Другие вопросы по теме