Могу ли я напрямую сопоставить данные из внешнего источника для сохранения в БД? - PullRequest
0 голосов
/ 22 марта 2020

Я довольно новый в Spring Data JPA и ORM в целом. У меня есть следующие архитектурные сомнения.

Давайте рассмотрим этот класс сущностей:

@Entity // This tells Hibernate to make a table out of this class
public class Order {

   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   private int id;

   @Column(name = "name")
   private String fullName;
   private String address;
   private String product;

   @Column(name = "order_date_time")
   private String orderDate;

   private Double quantity;

   // getters, setters 
}

Этот класс отображается в моей таблице базы данных order.

В данных моего приложения пришел из документа Excel, который я анализирую через Apace POI, и затем я должен сохранить его в базе данных. Я сомневаюсь: могу ли я напрямую использовать этот класс сущностей для сопоставления строки Excel, используя Apache POI, чтобы сохранить строки Excel как order записи таблицы? Или лучше использовать другой класс DTO для чтения строк из Excel и использовать этот DTO для установки значений полей моего класса сущностей?

Класс сущностей может содержать конструктор, использующий поля?

Ответы [ 3 ]

3 голосов
/ 22 марта 2020

Можно ли напрямую использовать этот класс сущностей для сопоставления строки Excel, используя Apache POI, чтобы сохранить строки Excel в качестве записей таблицы заказов?

Да, вы можете.

Или лучше использовать другой класс DTO для чтения строк из Excel, чем использовать этот DTO для установки значений полей моего класса сущностей?

Это, безусловно, распространено иметь слой DTO между ними, но это не обязательно, так что решать вам.

Класс сущности может содержать конструктор, использующий поля?

Да, но по крайней мере Hibernate также хочет иметь не приватный конструктор по умолчанию, поэтому не забудьте создать protected Order() {} (или любой модификатор видимости помимо приватного) в дополнение к параметризованному конструктору.

2 голосов
/ 22 марта 2020

Я не большой пользователь Apache POI, но я знаю, что он используется для манипулирования файлами MS.

Итак, вот мои два цента, в вашем случае вы можете просто прочитать и сопоставьте его непосредственно с классом Entity, поскольку он не предоставляет API для внешнего мира.

Однако, если вы создавали API REST / SOAP, я рекомендую поместить DTO между вы не ошибочно выставляете вещи, которые не должны быть разоблачены.

1 голос
/ 22 марта 2020

С архитектурной точки зрения лучше иметь класс DTO и инкапсулировать там некоторые логи c.

class CsvOrder {

    private String fullName;

    private String address;

    public CsvRecord(String[] record) {
        fullName = get(record, FULLNAME_INDEX);
        address = get(record, ADDRESS_INDEX);
    }

    public Order toOrder() {
        Order result = new Order();

        result.setFullName(fullName);

        return result;
    }

}

public static <T> T get(T[] arr, int index) {
    final T notFound = null;
    return index < size(arr) ? arr[index] : notFound;
}

public static <T> int size(T[] array) {
    return array == null ? 0 : array.length;
}

Вы можете поместить метод c toOrder() в OrderServiceMapper, если Вы хотите полностью отделить слои

class OrderServiceMapper {

    public static Order toOrder(CsvOrder order) {
        Order result = new Order();

        result.setFullName(order.getFullName());

        return result;
    }

}

Кроме того, используйте Integer вместо int для идентификатора. Лучше использовать Long везде

    // This tells Spring to add this class to Hibernate configuration during auto scan
    @Entity 
    public class Order {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Integer id;

    }
...