Следует ли создавать отдельную таблицу в БД для вспомогательного класса UserAddress Java, Hibernate, Postgres?

Я делаю небольшой рестфул сервис для управления пользователями. По заданию Пользователь определяется следующими значениями:

◦ Имя
◦ Фамилия
◦ Дата рождения
◦ Логин 
◦ Пароль 
◦ Поле ввода “О себе” 
◦ Адрес проживания (страна, город, улица, дом, квартира)

При проектировании я обратил внимание на адрес и подумал, что неправильно записывать все вместе в одно поле address и делать аналогичный атрибут в таблице базы данных, ведь тогда очень неудобной станет разная фильтрация по адресам. После чего я разграничил поле адрес на 5 полей(те что указаны в скобках). Впрочем, сделав так, я осознал, что мой класс с учетом поля id имеет 12 полей, что в моем понимании, делает класс слишком нагруженным и "неправильным". Тогда я решил сделать отдельный класс для адреса и использовать его в качестве поля у пользователя, а именно:

@Entity
public class UserAddress {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;
    private String country;
    private String city;
    private String street;
    private int house;
    private int flat;

}

И сделав так, я не совсем уверен как мне быть дальше, в следствии чего у меня возникают следующие вопросы:

  1. Стоит ли выносить 5 полей для адреса в отдельный класс в UserAddres?
  2. Если да, то стоит ли делать этот класс Entity и создавать под него таблицы в БД?
  3. Нужно ли относится к нему, как к полноценному классу (создавать геттеры/сеттеры, equals and hashcode, сервисный уровень)?
  4. Не станет ли фильтрация пользователей по адресу еще более сложной, чем при изначальном варианте?
  5. Как вообще лучше поступить в такой ситуации?

Ответы (1 шт):

Автор решения: Artur Vartanyan
  1. Да, но не все 5.

  2. Нет.

  3. Да, нужно.

  4. Наоборот, упроститься

  5. См. пример ниже:

Я предлагаю тебе сделать класс Address отдельным классом, но при этом пометить его как @Embeddable.

В твоем случае:

@Embeddable
public class UserAddress {

    private String country;

    private String city;

    private String street;

    private int house;

    private int flat;
}
@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @Embedded
    private UserAddress userAddress;
}

Затем в БД в табличку пользователя добавь все эти колонки, исходя из класса адреса:

User table:

varchar name, varchar last_name, ..., varchar country, varchar street, varchar city, integer house и т.д.

Больше инфо: https://www.baeldung.com/jpa-embedded-embeddable

→ Ссылка