#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 лучше всего использовать для «стабильной» базы данных, где структура данных не изменится.