Я ищу хороший способ создания объектов передачи данных (DTO) из сущности JPA и наоборот. Я хочу отправить DTO как JSON клиенту, а затем получить измененный DTO и сохранить его обратно в базу данных. Было бы наиболее легко выполнить метод слияния из EntityManager на полученном объекте после того, как он был разобран JSON на его класс Java.Образец для JPA: создание объекта передачи данных DTO из объекта и слияние DTO с базой данных
Например, есть следующее Entity и метод Rest для сохранения измененного объекта:
@Entity
@Table(name="CUSTOMER")
public class Customer {
@Id
Long id;
@Version
Long version;
String name;
String address;
String login;
String password;
String creditCardNumber;
@OneToMany(cascade = CascadeType.ALL)
List<Foo> fooList;
... Getter() and Setter()
}
private EntityManager em;
@POST
@Path("/saveCustomer")
public void saveCustomer (Customer customer) {
em.merge(customer);
return;
}
Это прекрасно работает до тех пор, как я отправить весь Entity класс, как JSON и получить весь Entity назад. Затем EntityManager объединит модифицированный объект с базой данных. Но когда я только хочу, чтобы обеспечить подмножество Entity (например, только имя и адрес клиента) будут проблемы:
Что бы лучший способ создать подмножество Субъект?
-Напишите DTO для сущности вручную? Это создаст повторяющийся код для каждого подмножества объекта, который должен поддерживаться.
Как объединить DTO, который является подмножеством объекта, обратно в базу данных?
-Использование метода merge() EntityManager не работает. Сначала DTO не является субъектом, поэтому его нельзя объединить. И только создание объекта из DTO будет иметь некоторые неустановленные значения в Entity. После слияния значения будут иметь значение NULL в базе данных.
Одна идея, которую я придумал, был указать дополнительные объекты для каждого подмножества Я хочу иметь для субъекта. (Подобно представлению базы данных) Это будет дублированный код, но он может решить проблему с объединением DTO в базу данных. (И, возможно, этот код может быть сгенерирован автоматически)
Например, Entity CustomerView1 ссылается на ту же таблицу, что и класс Customer, но предоставляет только имя и адрес клиента. Это DTO для реального класса Customer, который может быть отправлен как JSON и изменен вне сервера. Этот класс также может быть объединен с базой данных EntityManager.
@Entity
@Table(name="CUSTOMER")
public class CustomerView1 {
@Id
Long id;
@Version
Long version;
String name;
String address;
... Getter() and Setter()
}
Но у меня есть сомнения по поводу этого решения, я не знаю, если это будет беспорядок с кэшированием в JPA о Entities и может вызвать некоторые проблемы.
Мой вопрос, есть ли шаблон для решения дублирования кода для DTOS и объединений DTOs обратно в базу данных?
Или есть библиотека для этой цели? - Что-то вроде автогенерации для DTO и копирования DTO обратно в реальную Entity, чтобы объединить их с EntityManager.
Чтобы сохранить некоторые строки кода, вы можете использовать библиотеку apache commons-BeanUtils. Взгляните сюда http://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html В нем есть утилиты-методы, которые копируют свойства из/в pojo с отражением. – gipinani