Это сообщение относится к этому сообщению на 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
}