首页 > 解决方案 > 在 Hibernate 多对多映射中需要以下场景的解决方案

问题描述

考虑帖子标签之间呈现多对多关系的表格。

多对多关系是使用名为 post_tags 的第三个表实现的,该表包含帖子的详细信息及其相关标签。

Post Model

@Entity
@Table(name = "posts")
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Size(max = 100)
    @Column(unique = true)
    private String title;

    @NotNull
    @Size(max = 250)
    private String description;

    @NotNull
    @Lob
    private String content;

    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "posted_at")
    private Date postedAt = new Date();

    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "last_updated_at")
    private Date lastUpdatedAt = new Date();


    @ManyToMany(fetch = FetchType.LAZY,
            cascade = {
                CascadeType.PERSIST,
                CascadeType.MERGE
            })
    @JoinTable(name = "post_tags",
            joinColumns = { @JoinColumn(name = "post_id") },
            inverseJoinColumns = { @JoinColumn(name = "tag_id") })
    private Set<Tag> tags = new HashSet<>();


    public Post() {

    }

    public Post(String title, String description, String content) {
        this.title = title;
        this.description = description;
        this.content = content;
    }

    // Getters and Setters (Omitted for brevity)
}

TAG Model

@Entity
@Table(name = "tags")
public class Tag {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Size(max = 100)
    @NaturalId
    private String name;

    @ManyToMany(fetch = FetchType.LAZY,
            cascade = {
                CascadeType.PERSIST,
                CascadeType.MERGE
            },
            mappedBy = "tags")
    private Set<Post> posts = new HashSet<>();

    public Tag() {

    }

    public Tag(String name) {
        this.name = name;
    }

    // Getters and Setters (Omitted for brevity)
}

问题是

我尝试使用现有的标签。并且插入只发生在帖子和帖子标签表上。

最初,我使用 tagName(s) 获取标签。一旦你有了 Tag 对象,你就可以在 Post 对象中设置它并保存它。

像这样

 Post post = new Post("Hibernate Many to Many Example with Spring Boot",
                "Learn how to map a many to many relationship using hibernate",
                "Entire Post content with Sample code");

        // Create two tags
        Tag tag1 = tagService.getTag("Spring Boot");


        // Add tag references in the post
        post.getTags().add(tag1);

        postRepository.save(post);

如果我喜欢这样,则 post_tags 表中的条目不可用。

标签存储库和标签服务:

@Repository
public interface TagRepository extends JpaRepository<Tag, Long> {

    @Query("select p from Tag p where p.name = :name")
    Tag findByName(@Param("name") String name);
}

@Override
public Tag findByName(String name) {
  return repository.findByName(name);
}

标签: springhibernatemany-to-many

解决方案


推荐阅读