JPA Hibernate Разделение данных между двумя таблицами - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть REST API, который будет получать данные о клиентах в следующем формате:

{
    "customer_Id": 50,
    "name": "name",
    "company_name": "company_name",
    "email": "email@provider.com",
    "business_phone": "(00) 1111-2222",
    "mobile_phone": "(00) 1111-2222",
    "document": "123456789",
    "state_registration_number": "ISENTO",
    "state_registration_type": "NO_CONTRIBUTOR",
    "city_registration_number": "ISENTO",
    "classification": "AUTO",
    "address": {
        "street": "STREET NAME XXX",
        "number": "NUMBER XX",
        "complement": "COMPLEMENT",
        "zip_code": "ZIP_CODE",
        "neighborhood": "NEIGHBORHOOD",
        "city": "CITY",
        "state": "STATE"
    }
}

Я хотел бы сохранить эти данные в двух таблицах: одна таблица должна содержать «основные» данные клиента, а другая должна содержать данные «адреса» клиента.

Итак, я определил сущность Customer следующим образом:

@Data
@Entity(name = "X_CUSTOMERS")
public class Customer {

    @Id
    private int customer_Id;

    @NotNull
    private String name;

    private String company_name;

    private String email;

    private String business_phone;

    private String mobile_phone;

    @NotNull
    private String document;

    private String state_registration_number;

    private String state_registration_type;

    private String city_registration_number;

    @NotNull
    private String classification;

    @OneToOne(cascade = CascadeType.ALL)
    private Address address;

}

А Address сущность как

@Data
@Entity(name = "X_ADDRESS")
public class Address {

    @NotNull
    private String street;

    private String number;

    private String complement;

    private String zip_code;

    private String neighborhood;

    private String city;

    private String state;

}

Но я не мог понять, как создать отношения между ними. Должен ли я создать атрибут customer_id для объекта Address? Должен ли я определить дополнительные теги для атрибута Customer address? Обратите внимание, что у меня нет клиента для данных JSON, которые публикуются клиентом REST, и, если клиент обновляется или удаляется, данные адреса также должны обновляться / удаляться.

Извините, если это такой тривиальный вопрос. В эти дни я изучаю основы JPA / Hibernate, и ваш ответ направит меня в правильном направлении, чтобы избежать таких вещей, как «изобретать велосипед».

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Если мы рассматриваем Address как объект значения, а не как сущность, тогда его можно отобразить, как показано ниже. В вашем случае, вероятно, было бы правильно смоделировать его как VO: если вы строили базу данных адресов, то это можно было бы считать сущностью. Подробнее здесь:

Значение по сравнению с объектами Entity (Domain Driven Design)

Затем мы можем сделать класс адресов @Embeddable, а не сущностью: тогда у него не будет собственной идентичности. Для хранения информации о клиенте и адресе в отдельных таблицах мы также можем использовать JPA @SecondaryTable funtionality:

https://docs.oracle.com/javaee/7/api/javax/persistence/SecondaryTable.html

У нас есть классы моделей, как показано ниже. С этими сопоставлениями ваши обновления JSON будут работать как положено.

Клиент

@Data
@Table(name = "customers")
@SecondaryTable(name = "customer_addresses",  pkJoinColumns={
        @PrimaryKeyJoinColumn(name="customer_id", 
            referencedColumnName="customer_id")})
public class Customer {

    protected static final String ADDRESS_TABLE_NAME = "customer_addresses";

    // other fields

    @Embedded
    private Address address;

}

Адрес :

@Data
@Embeddable
public class Address {

    @NotNull
    @Column(table = Customer.ADDRESS_TABLE_NAME)
    private String street;

    @Column(table = Customer.ADDRESS_TABLE_NAME)
    private String number;

    @Column(table = Customer.ADDRESS_TABLE_NAME)
    private String complement;

    @Column(table = Customer.ADDRESS_TABLE_NAME)
    private String zip_code;

    @Column(table = Customer.ADDRESS_TABLE_NAME)
    private String neighborhood;

    @Column(table = Customer.ADDRESS_TABLE_NAME)
    private String city;

    @Column(table = Customer.ADDRESS_TABLE_NAME)
    private String state;
}
0 голосов
/ 07 ноября 2018

Вот как я это делаю:

@OneToOne (fetch=FetchType.EAGER, cascade = CascadeType.ALL, optional = false)
@NotNull(message = "L'addresse du domicile est requise!", groups = Seventh.class)
@Getter
@Setter
private Address homeAddress;

Нет необходимости в инверсном сопоставлении, и это позволяет мне одним махом сохранить клиента и его адрес!

Вам также нужен идентификатор для вашей адресной сущности, например:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
@Getter
@Setter
private Long id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...