Нужно решение для следующего сценария в Hibernate много-много картографирования - PullRequest
0 голосов
/ 16 ноября 2018

Рассмотрим таблицы, в которых теги 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...