Рассмотрим таблицы, в которых теги posts и демонстрируют взаимосвязь «многие ко многим».
Связь «многие ко многим» реализована с использованиемтретья таблица с именем 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)
}
Проблема в том, что
Я пытался использовать существующие теги.и вставка произошла только в таблице posts & posts_tags.
Изначально я получаю тег (ы) с 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);
}