Как правильно сопоставить на одну таблицу сущность разделенную на несколько классов

186
13 августа 2021, 05:50

Есть таблица на 30 и более полей. Я хочу разделить данную таблицу на несколько классов и в каждом классе по 5 полей, чтобы удобней было работать. Создаю абстрактные классы, которые наследуются друг от друга. И последний класс будет иметь статус «produce».

 @MappedSuperclass
    public abstract class OneBaseAbstract {
        @Id
@Column(name = "ID_ISX", nullable = false, updatable = false)
        private Long id;
        private String name;
        public OneBaseAbstract() {
        }
    /*
     getters
     setters*/
    / *
     equals and hashCode
     */
     @Override
    public String toString() {
        return "OneBaseAbstract{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

public abstract class TwoBaseAbstract extends OneBaseAbstract{
    private Integer num;
    private String mark;
    public TwoBaseAbstract() {
        super();
    }
/*
 getters
 setters*/
/ *
 equals and hashCode
 */

    @Override
    public String toString() {
     String superString = super.toString();
       return superString + "TwoBaseAbstract{" +
        "num=" + num +
        ", mark='" + mark + '\'' +
        '}';
    }
}
@Entity
@Table(name = "name_table")
public class Produce extends TwoBaseAbstract {
    private String name;
    private String product;
    public Produce() {
        super();
    }
    /*
 getters
 setters*/
/ *
 equals and hashCode
 */
    @Override
    public String toString() {
        String superString = super.toString();
        return superString + "Produce{" +
                "name='" + name + '\'' +
                ", product='" + product + '\'' +
                '}';
    }
}

public interface ProduceRepository 
        extends CrudRepository<Produce,Long> {
}

Абстрактных промежуточных классов будет столько, сколько нужно чтобы разделить таблицу. Например, я использую по 5 полей для каждого класса.

Производный класс будет вызываться, чтобы сформировать единую сущность и заполнить поля, которые будут сопоставлены в таблицу.

Правильно ли я применил подход, и нужно ли указать аннотацию @MappedSuperclass на промежуточных абстрактных классов ?

Я ее указал для каждого промежуточного абстрактного класса.

И это работает. Тип генерации Id не указывал, так как для этой таблице в oracle стоит триггер, который при вставке новой записи, автоматически формирует id.

Как в этом случае работает вычисление hash code и работа equals для полностью готового объекта?

Я использую для конвертации mapstruct, я должен аналогичную структуру создать на стороне DTO ?

Как будет работать Builder, если его создать в каждом классе отдельно то же?

Oбновление

Использовал плагин InnerBuilder в классе-производителе на стороне DTO автоматически сгенерировал нужные поля. Для конвертации между DTO и Entity настроен MapStruct по умолчанию (когда объявлен интерфейс Mapstuct, не забывайте выполнить сборку проекта, чтобы потом можно было вызывать конвертер в коде )

Answer 1

Можно объединить логические группы полей в отдельные классы, но мапить все в одну таблицу с помощью аннотации @Embedded

Довольно неплохо это продемонстрировано здесь

READ ALSO
отправка audio на сервер (java android, volley)

отправка audio на сервер (java android, volley)

Я Java изучаю только месяц и никак не могу понять, как правильно отправить audio, файл кодируется в base64 не верно и файл на сервере не открываетсяКак...

181
Как правильно работать с триггером таблицы базы Oracle при использовании Spring Data

Как правильно работать с триггером таблицы базы Oracle при использовании Spring Data

Для автоматической генерации id записи в базу oracle, используется встроенный триггер, ранее использовалась последовательность

178
Скрыть элемент css при клике на гамбургер

Скрыть элемент css при клике на гамбургер

как скрыть #fp-nav, когда гамбургер активен, и показать снова, когда гамбургер закрыт циклично? Я набросал немного и сделал функцию, она выполняет...

199