Сохранение сущностей в SpringData без необходимости извлекать ассоциации - PullRequest
0 голосов
/ 28 ноября 2018

Я недавно начал проект, который использует 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 на верхних уровнях?

1 Ответ

0 голосов
/ 02 июля 2019

Вы можете попробовать установить автора с помощью:

Author currentAuthor = new Author();
currentAuther.setIdAuthor(dtoBook.getIdAuthor());
entityBook.setAuthor(currentAuthor);

Это не создаст нового автора, если существует уже существующий с тем же первичным ключом.Пожалуйста, проверьте тип каскада при установке этого

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