Как использовать класс Java как сущность, а также как модель

У меня есть класс сущности "classA" и класс модели "ClassA1". ClassA используется для хранения значений в базе данных mysql со стороны сервера, а ClassA1 используется для преобразования строки ответа API в объект на стороне клиента.

Теперь у меня есть два класса Java с одинаковыми геттерами и сеттерами, но ClassA содержит аннотации спящего режима, а ClassA1 - это просто POJO. Рассмотрим следующие структуры классов

Класс A.java

@Entity
@Table(name="classA")
public class ClassA {
    @Id
    private int id;
    private String name;

    public int getId() {
        return id
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Класс A1.java

public class ClassA1 {
    private int id;
    private String name;

    public int getId() {
        return id
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Мое приложение содержит больше классов, подобных приведенным выше. Я хочу избежать этого, потому что если я добавлю какой-либо столбец в свою базу данных, в настоящее время я добавляю геттеры и сеттеры как в ClassA, так и в ClassA1.

Есть ли способ использовать один класс как для серверных, так и для клиентских модулей?


person Achaius    schedule 22.09.2016    source источник
comment
В чем проблема, с которой вы сталкиваетесь, имея и то, и другое?   -  person Akashdeep Saluja    schedule 22.09.2016
comment
Если я использую тот же класс, модель на стороне клиента также загружает код, связанный с jpa, который мне действительно не нужен.   -  person Achaius    schedule 22.09.2016
comment
@Achaius, какой код, связанный с JPA, загружается?   -  person Karthikeyan Vaithilingam    schedule 22.09.2016
comment
Все javax.persistence.* из ClassA загружаются в модель на стороне клиента, которая не нужна клиенту. Код на стороне клиента просто хочет преобразовать строку ответа JSON в объект для дальнейшего использования.   -  person Achaius    schedule 22.09.2016
comment
Это просто аннотации, которые ничего не делают!   -  person Adrian Shum    schedule 24.09.2016


Ответы (2)


Вы можете просто попробовать использовать один и тот же класс в обеих ситуациях. Он должен работать. Именно так я пытался в начале одного из моих ранних проектов. Пока вы можете тщательно обрабатывать JPA-слияние ClassA, которое вы получили от клиентской стороны, рассматривая это как отдельный объект.

Однако, когда дизайн вашего объекта становится более сложным, вы сталкиваетесь с множеством проблем (и именно поэтому я отказываюсь от этого подхода в своем проекте: P). Одна из самых больших проблем заключается в том, что, учитывая, что вы смоделировали отношения сущностей, как только вы попытаетесь «сериализовать» их для использования клиентом, многие решения (JAXB и т. д., в то время я выполнял проекты) будут рекурсивно отслеживать через все отношения и попытаться преобразовать его. Такое поведение вызовет массовое ленивое извлечение сущностей, и сериализованная форма результата будет содержать огромное количество (неиспользуемых) данных. Хотя вы можете управлять поведением (добавляя какую-либо аннотацию игнорирования и т. д.), объект результата станет запутанным в обслуживании.

Поэтому то, что вы делаете, имхо, неразумно. Чего вам нужно остерегаться, так это относиться к объекту значения (то, что вы назвали «Модель») чем-то для «представления». Вам не нужно делать его строго таким же, как ваши объекты.

Используйте / разработайте некоторую служебную библиотеку для обработки построения объекта значения из сущностей и заполнения данных из объекта значения обратно в сущности.

Конечно, это предложение может не относиться к вам, учитывая, что вы мало что рассказали о своей архитектуре.

person Adrian Shum    schedule 22.09.2016

Вы можете указать сопоставления Hibernate отдельно в файле XML вместо использования аннотаций. Это старый способ сделать это, в настоящее время большинство людей используют аннотации, потому что это более удобно и соответствует стандарту JPA (в основном).

Другим решением является использование структуры сопоставления компонентов, такой как Dozer, чтобы упростить сопоставление.

Довольно часто вы разделяете свои постоянные (JPA) сущности и объекты-значения, используемые представлениями в вашей архитектуре. Вы можете настроить объекты значений для представления, в котором они используются. Может быть, представлению не нужна полная сущность пользователя, а только идентификатор, имя и адрес? Если это так, это облегчает связь между представлением и серверной частью и частично устраняет дублирование между вашими объектами ValueObject и постоянными сущностями.

person Adriaan Koster    schedule 22.09.2016