доступ ко многим отношениям весной - PullRequest
0 голосов
/ 06 октября 2019

У меня есть класс с именем Tag:

@Entity
@Table(name = "tags")
public class Tag {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @ManyToMany(fetch = FetchType.LAZY,
            cascade = {
                CascadeType.PERSIST,
                CascadeType.MERGE
            },
            mappedBy = "tags")
    private Set<Post> posts = new HashSet<>();

    ...
}

И класс с именем Post

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


    @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<>();


        ...
}

Этосоздает другую таблицу с именем post_tags.

Как мне написать Controller для доступа к этой таблице, поскольку она не похожа на хранилище?

Есть ли более простой и удобный способ реализации ManyToMany отношения?

My pom.xml

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Вам не нужно обращаться к этой таблице отношений вручную. Вы можете загрузить все Tag сущности, а затем загрузить все упомянутые Post сущности.

Таблицей отношений управляет ваш ORM-фреймворк.

Но, если вы все еще хотитедля доступа к таблице отношений вы можете использовать собственные запросы в вашем репозитории Spring Data JPA, например,

@Query(value="select post_id, tag_id from post_tags", nativeQuery=true)
List<PostTag> loadPostTags();

PostTag класс не является объектом, управляемым jpa, и должен соответствовать структуре возвращаемой таблицы:

public class PostTag {
 private long postId;
 private long tagId;
 // getter, setter
}
0 голосов
/ 07 октября 2019

Используйте этот способ

@Entity
@Table(name = "tags")
public class Tag {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;
   private String name;

   @ManyToMany(cascade = CascadeType.ALL)
   @JoinTable(name = "post_tags",
        joinColumns = { @JoinColumn(name = "id") },
        inverseJoinColumns = { @JoinColumn(name = "post_id") })
   private Set<Post> posts = new HashSet<>();

...
}

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