Я недавно начал проект, который использует Spring Boot.Я все еще изучаю некоторые концепции, но некоторые вещи, связанные с доступом к данным, меня немного беспокоят.Позвольте мне привести пример.
У меня есть несколько сущностей:
@Entity
class Book {
@Id
private Long idBook;
private String title;
@ManyToOne
@JoinColumn(name = "idAuthor")
private Author author;
}
@Entity
class Author {
@Id
private Long idAuthor;
private String name;
@OneToMany(fetch = FetchType.LAZY)
private List<Book> books;
}
Ради простоты предположим, что в Книге может быть только один Автор.
Хранилище книг представляет собой простой интерфейс:
public interface BookRepository extends JpaRepository<Book, Long> {}
У меня также есть DTO для книг:
class BookDTO {
private Long idBook;
private String title;
private idAuthor;
}
Когда клиент хочет сохранить книгу, он будетотправьте json так:
{
"idBook":328,
"title":"The Martian Chronicles",
"idAuthor":56
}
Каждый раз, когда кому-то нужно сохранить книгу, он будет преобразовывать DTO в сущность и извлекать автора перед сохранением:
entityBook.setId(dtoBook.getId());
entityBook.setTitle(dtoBook.getTitle());
entityBook.setAuthor(authorRepository.getById(dtoBook.getIdAuthor()));
bookRepository.save(entityBook);
Для меня это кажетсяпустая трата ресурсов, так как нужно сохранить только idAuthor.Это простой пример.Реальные жизненные ситуации, с которыми я сталкиваюсь, намного сложнее и иногда могут разочаровывать.
Я нашел решение, используя метод EntityManager :: getReference .
сохранение нового объекта без необходимости извлечения ассоциаций
постоянный объект Hibernate без извлечения объекта ассоциации.просто по id
Проблема (если я не понял ее неправильно) заключается в том, что получение ссылки на EntityManager (внедренной через @PersistenceContext) вне репозиториев не является хорошей практикой, и преобразование из dto всущность создается на слое перед вызовом в репозитории.
Есть ли альтернативный способ сделать это без доступа к EntityManager на верхних уровнях?