Я хочу разобраться с распространенной ошибкой, но не могу найти правильный ответ. ошибка:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: newsProject.post.entity.Tag.posts, could not initialize proxy - no Session
Как избежать использования @Transactional
?
Я пытаюсь выполнить следующие действия в моем SpringBootTest:
@SpringBootTest
@ActiveProfiles("test")
class PostRepositoryTest {
@Autowired
private PostRepository postRepository;
@Autowired
private TagRepository tagRepository;
@AfterEach
void deleteFromDB(){
postRepository.deleteAll();
tagRepository.deleteAll();
}
@Test
void deletePostWithMultipleTags(){
Post post = new Post();
Tag tag = new Tag(1L,"tag1", null);
Tag tag2 = new Tag(2L,"tag2", null);
Tag tag3 = new Tag(3L,"tag3", null);
tagRepository.save(tag);
tagRepository.save(tag2);
tagRepository.save(tag3);
post.setTitle("testTitle");
Tag tagNew = tagRepository.findByTagName(tag.getTagName());
post.addTag(tagNew);
post.addTag(tagRepository.findByTagName(tag2.getTagName()));
post.addTag(tagRepository.findByTagName(tag3.getTagName()));
System.out.println(post);
postRepository.save(post);
}
}
ошибка в этой части:
public void addTag(Tag tag) {
tags.add(tag);
tag.getPosts().add(this);
}
Я открыт для любых дополнительных вопросов, связанных с этой проблемой
Я не хочу использовать следующие ответы: - Fetch.EAGER (или что-то связанное с с выключением Fetch.LAZY) - hibernate.enable_lazy_load_no_trans = True
Код:
Почта. java
@Entity
@Data
@Table
@NoArgsConstructor
@AllArgsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "post_generator")
@SequenceGenerator(name="post_generator", sequenceName = "seq_post", allocationSize = 1)
private Long id;
@Enumerated(EnumType.STRING)
private Status status;
//Some code
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(
name = "post_tag",
joinColumns = {@JoinColumn(name = "post_id")},
inverseJoinColumns = {@JoinColumn(name = "tag_id")})
private List<Tag> tags = new ArrayList<>();
public void addTag(Tag tag) {
tags.add(tag);
tag.getPosts().add(this);
}
public void removeTag(Tag tag) {
tags.remove(tag);
tag.getPosts().remove(this);
}
}
Tag. java
@Entity
@Data
@Table
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = "posts")
public class Tag {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_generator")
@SequenceGenerator(name="id_generator", sequenceName = "seq_tag", allocationSize = 1)
private Long id;
private String tagName;
@ManyToMany(mappedBy="tags")
List<Post> posts = new ArrayList<>();
public void addPost(Post post) {
posts.add(post);
post.getTags().add(this);
}
public void removePost(Post post) {
posts.remove(post);
post.getTags().remove(this);
}
}