Что такое хороший шаблон для данных владелец / ребенок JSON в отношениях ManyToMany с использованием Spring Data JPA? - PullRequest
0 голосов
/ 15 января 2020

Я новичок в Spring и пытаюсь изучить его вместе с Hibernate.

У меня есть ситуация, когда у меня есть Users и Tasks в качестве сущностей, и у меня есть отношение ManyToMany между ними. Я смог реализовать это весной, используя следующие классы:

public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  private String name;

  @Column(name = "username", unique = true, nullable = false)
  private String username;

  private String profile_url;
  private String email;

  @JsonIgnore
  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(
    name = "user_tasks",
    joinColumns = {
      @JoinColumn(name = "user_id")
    },
    inverseJoinColumns = {
      @JoinColumn(name = "task_id")
    }
  )
  private Set<Task> tasks = new HashSet<>();
}

и

public class Task {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  private String title;
  private String description;

  private double storyPoints;

  @CreationTimestamp
  private Instant creationTimestamp;

  @UpdateTimestamp
  private Instant updateTimestamp;

  @ManyToMany(mappedBy = "tasks", cascade = CascadeType.ALL)
  private Set<User> users = new HashSet<>();
}

Я пробовал много вещей, но я не могу понять, как подход, вставив users в task json в моем Controller. Когда я POST до /api/users/, я должен иметь возможность использовать этот формат JSON,

{
    "name": "Hardworking Employee",
    "username": "employee",
    "email": "employee@company.com",
    "profile_url": "https://profile.pic",
}

, и это прекрасно работает. Когда я POST до api/tasks/, в идеале я хотел бы отправить что-то по этим линиям

{
    "title": "Do this also",
    "description": "Let's try to do this now",
    "storyPoints": 1.25,
    "users": [
        "employee"
    ]
}

, где ключ users отображается в массив usernames или, возможно, массив ids. Однако это не будет правильно регистрироваться. Джексон, скорее всего, ожидает массив Users, и не существует конструктора User с одним String. Но даже если бы существовал, не было бы способа найти правильного пользователя, так как этот конструктор должен был бы быть создан на уровне model.

В общем, я хотел бы знать, что такое хороший шаблон подойти к этой проблеме? Должен ли я поставить дополнительный лог c на моем контроллере? Может ли кто-нибудь вести меня по пути к праведности.

...