Удалить от многих ко многим. Как я могу запомнить параметр из URL? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть 2 таблицы: Технические характеристики и Детали с отношением многие ко многим. Поэтому я создаю таблицу Spec_Parts для этой связи. В своем проекте я использую Thymeleaf и Spring Data JPA. У меня есть кнопка «Все спецификации», которая дает мне страницу со списком всех спецификаций. Все спецификации состоят из «частей». Так что рядом с каждой спецификацией у меня есть кнопка «Просмотр частей», открывающая страницу со списком «частей» текущей «Спецификации».

<div align="center">
  <table border="1">
    <tr>
      <th>id</th>
      <th>name</th>
      <th>Exporter</th>
      <th>Type</th>
      <th>Description</th>
    </tr>
    <tr th:each="part : ${parts}">
      <td th:utext="${part.getId()}">...</td>
      <td th:utext="${part.getName()}">...</td>
      <td th:utext="${part.getExportJpa().getName()}">...</td>
      <td th:utext="${part.getTypesJpa().getName()}">...</td>
      <td th:utext="${part.getDescription()}">...</td>
      <td>
        <form th:action="@{/deletePartInSpec}" method="post">
          <input type="hidden" name="id" th:value="${part.id}" />
          <input type="submit" value="Delete" class="btn btn-danger" />
        </form>
      </td>
    </tr>
  </table>
</div>

URL:

http://localhost:8080/allParts?id=1

Где id = 1 означает первую «Спецификацию». Сейчас я пытаюсь создать кнопку «Удалить», но не знаю, как мне запомнить идентификатор текущей «Спецификации» и отправить его контроллеру. Итак, как я могу удалить некоторые «Детали» из «Спецификаций»?

Детали:

@Entity
@Table(name = "PARTS")
public class PartsJpa {
    @Id
    private int id;
    @Column(name = "NAME")
    private String name;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "ID_EXPORT", unique = false, nullable = false, updatable = true)
    private ExportJpa exportJpa;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "ID_TYPE", unique = false, nullable = false, updatable = true)
    private TypesJpa typesJpa;

    @Column(name = "DESCRIPTION")
    private String description;

    @ManyToMany(fetch = FetchType.EAGER)
    private Set<SpecJpa> specJpa; 

Спецификации:

@Entity
@Table(name = "SPEC")
public class SpecJpa {
    @Id
    private int id;
    @Column(name = "NAME")
    private String name;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "Creator_ID", unique = false, nullable = false, updatable = true)
    private UsersJpa usersJpa;
    @Column(name = "DESCRIPTION")
    private String description;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name="SPEC_PARTS",
            joinColumns = @JoinColumn(name="ID_PARTS", referencedColumnName="id"),
            inverseJoinColumns = @JoinColumn(name="ID_SPEC", referencedColumnName="id")
    )
    private Set<PartsJpa> partsJpa;

1 Ответ

1 голос
/ 26 мая 2020

В вашем контроллере деталей у вас уже есть идентификатор спецификации (allParts? id = 1 ), вы также должны добавить его в модель.

model.add("specificationId", /* specification id from url */ );

Затем, в вашей форме вы передаете оба идентификатора.

<form th:action="@{/deletePartInSpec}" method="post">
  <input type="hidden" name="spec_id" th:value="${specificationId}" />
  <input type="hidden" name="part_id" th:value="${part.id}" />
  <input type="submit" value="Delete" class="btn btn-danger" />
</form>

Вы должны иметь возможность удалить эту связь на основе этих двух идентификаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...