Следует ли создавать отдельную таблицу в БД для вспомогательного класса 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;
}
И сделав так, я не совсем уверен как мне быть дальше, в следствии чего у меня возникают следующие вопросы:
- Стоит ли выносить 5 полей для адреса в отдельный класс в UserAddres?
- Если да, то стоит ли делать этот класс Entity и создавать под него таблицы в БД?
- Нужно ли относится к нему, как к полноценному классу (создавать геттеры/сеттеры, equals and hashcode, сервисный уровень)?
- Не станет ли фильтрация пользователей по адресу еще более сложной, чем при изначальном варианте?
- Как вообще лучше поступить в такой ситуации?
Ответы (1 шт):
Да, но не все 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