spring - 在 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);
}
解决方案
推荐阅读
- haskell - Nix 构建无法构建 haskell 包“由于来自 Cabal 的严重配置时警告而中止”“未找到 uhc”
- javascript - Flask - 检查服务器上是否存在文件,如果存在则返回警报
- c# - 在c#中获取最大柱形图的标签
- javascript - 允许使用 Express JS 和 HTML5 fetch() 进行跨域请求
- r - 制作数据框,并使用它来创建直方图
- python - 即使某些元素不存在,也要刮掉所有东西
- laravel - 如何在 laravel (sweetalert2) 中包含来自 node_modules 的文件
- java - CXFNonSpringJaxrsServlet ClassNotFoundException
- spring-webflux - 在多个 Flux 结束时同步,例如 subscribe() 和 then()
- java - 表未映射