Как правильно добавить несколько объектов в один объект в Hibernate - PullRequest
0 голосов
/ 28 апреля 2020

Это сообщение относится к этому сообщению на SO . Сущность включает туда код.

Я пишу новостной сайт. У меня есть форма HTML, с помощью которой я получаю данные tag.name, post.name и более. Теги предварительно сохраняются в базе данных.

Отношение сущности: @ManyToMany с дополнительным столбцом.

Далее в @Service Я хотел бы взять все объекты и сохраните их в базе данных, однако, если я использую tagRepository.findByName (...) дважды, то для второй и последующих зависимостей возникает ошибка, которая описана ниже, ОДНАКО, если я использую getOne (...), ошибка не выползает, и все работает нормально.

Вопрос:
Я прочитал в Inte rnet, что getOne() работает лучше, чем findById(...), однако в моем случае я не могу использовать getOne (), потому что форма делает не пройти Id. Что делать то? один из вариантов - добавить идентификатор тега к идентификатору <input type" hidden ">, но я не думаю, что это хорошая практика. Подскажите, что делать?

PS @ Transactional не помогает.

Пример 1:

    @Test
    @Order(1)
    void saveMultipleTagToPost() {
        Tag tag = new Tag();
        tag.setName("book");
        tagRepository.saveAndFlush(tag);

        Tag tag2 = new Tag();
        tag2.setName("business");
        tagRepository.saveAndFlush(tag2);

        Post post = new Post();
        post.setTitle("Spring");
        post.addTag(tagRepository.findByName("book"));
        post.addTag(tagRepository.findByName("business"));

        postRepository.saveAndFlush(post);

        post = postRepository.findByTitle("business");

        //Some code
    }

Ошибка:

org.user.orm.jpa.JpaSystemException: Could not set field value [SHORT_CIRCUIT_INDICATOR] value by reflection : [class com.user.manyToMany.entity.PostTagId.postId]
 setter of com.antonio112009.manyToMany.entity.PostTagId.postId; nested exception is org.hibernate.PropertyAccessException: Could not set field value [SHORT_CIRCUIT_INDICATOR]
 value by reflection : [class com.user.manyToMany.entity.PostTagId.postId] setter of com.user.manyToMany.entity.PostTagId.postId

Пример 2:

@Test
    @Order(4)
    void saveMultipleTagToPost() {
        Tag tag = new Tag();
        tag.setName("Hibernate");
        tagRepository.saveAndFlush(tag);

        Tag tag2 = new Tag();
        tag2.setName("High-Performance Java Persistence");
        tagRepository.saveAndFlush(tag2);

        Post post = new Post();
        post.setTitle("business");
        post.addTag(tagRepository.getOne(1L));
        post.addTag(tagRepository.getOne(2L));

        postRepository.saveAndFlush(post);

        post = postRepository.findByTitle("business");

        //Some asserts

    }
...