Лучшая практика для вставки данных в таблицу отношений со многими столбцами (без ORM)

#java #spring #database #jdbc #insert

Вопрос:

У меня есть ОТЧЕТ по таблице. Эта таблица связана (например) с КЛИЕНТОМ таблицы и ТЕГОМ таблицы.

В запросе я получаю один ОТЧЕТ с 1-20 КЛИЕНТАМИ и 1-20 ТЕГАМИ. Мне нужно вставить его в БД (postgre).

Как я могу это сделать, если я могу использовать только JdbcTemplate? (Все ОРМ запрещено). Конечно, с транзакциями и откатом? Мне нужна только какая-то идея.

Комментарии:

1. У вас есть табличный ОТЧЕТ для отчетов, ТЕГ для тегов и КЛИЕНТ для клиентов. У вас также есть таблицы отношений, такие как REPORT_TAG и REPORT_CLIENT?

2. @morsor нет, только эта таблица 3. Таблица имеет внешний ключ для связи. В ОТЧЕТЕ нет информации о клиенте и теге, но в таблице тегов и клиентов существует столбец ReportId

3. Таким образом, ТЕГ или КЛИЕНТ могут быть связаны только с одним ОТЧЕТОМ?

4. @morsor да, вы правы

5. У вас есть опыт работы с весной? Вы знаете, для чего нужны «@Репозиторий » и «@Сервис»?

Ответ №1:

Класс модели отчета

 @Entity @Table(name = "reports") public class Report {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private int id;   private String name;   @OneToMany(mappedBy="report")  private Listlt;Clientgt; clients;   @OneToMany(mappedBy="report")  private Listlt;Taggt; tags; }  

Класс клиентской модели

 @Entity @Table(name = "clients") public class Client {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;   private String name;   @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)  @JoinColumn(name = "report_id")  private Report report; }  

Класс модели тегов

 @Entity @Table(name = "tags") public class Tag {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Long id;   private String tagName;   @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)  @JoinColumn(name = "report_id")  private Report report; }  

Контроллер отчетов

 Report report = new Report();  report.setName("Report");   Listlt;Clientgt; clientList = new ArrayListlt;gt;();  Client client1 = new Client();  client1.setName("user1");  Client client2 = new Client();  client2.setName("user2");  clientList.add(client1);  clientList.add(client2);   Listlt;Taggt; tagList = new ArrayListlt;gt;();  Tag tag1 = new Tag();  tag1.setTagName("tag1");  tagList.add(tag1);   report.setClients(clientList);  report.setTags(tagList);   Report resultReport = reportRepository.save(report);  

Используйте это в качестве ссылки, это сработает.

Ответ №2:

Избегая ORM, можно было бы использовать JdbcTemplate, который, как я предполагаю, будет введен в 3 @Репозитория ниже:

 @Repository public class TagRepository {   public void insertreport(Report report) {  .. do an insert using @JdbcTemplate  }  }  @Repository public class TagRepository {   public void insertTags(Listlt;Taggt; tags) {  .. do a bulk insert using @JdbcTemplate  }   }  @Repository public class ClientRepository {   public void insertClients(Listlt;Clientgt; clients) {  .. do a bulk insert using @JdbcTemplate  }  }  @Service public class ReportService {   @Autowire 3 @Repository above   @Transactional  public void addReport(Report report) {  reportRepository.insertReport(report);  tagRepository.insertTags(report.getTags());  clientRepository.insertClients(report.getClients());  }  }  

Довольно подробный код, но разделение на @Репозитории разумная инкапсуляция может сделать его терпимым.

Пожалуйста, обратите внимание: JdbcTemplate лучше всего использовать для «стабильной» базы данных, где структура данных не изменится.