Сохранение идентификатора отношения в родительском классе для сопоставления «один к одному» в спящем режиме - PullRequest
0 голосов
/ 18 мая 2018

У меня есть два простых класса, которые называются Student и Location

@Entity
public class Student {

    private String name;
    private Integer id;

    @OneToOne(fetch = FetchType.EAGER, mappedBy = "student", cascade = CascadeType.PERSIST)
    @JsonProperty("location")
    private Location location;


    /* Getters and Setters */

}

@Entity
public class Location {

    private Integer id;
    private String locationName;
    private String street;
    private String postalCode;

    @OneToOne(fetch = FetchType.EAGER)
    @PrimaryKeyJoinColumn
    @JoinColumn(name = "student_id")
    private Student student;


    /* Getters and Setters */

}

В настоящее время схема такова, что id учащегося хранится в таблице местоположений, но логически Location не зависит от Studentюридическое лицо.Это Student, который должен иметь идентификатор Location сущности

На основании всех примеров, которые я видел в Интернете, в моем случае это дочерний класс Location, который в конечном итоге имеет отношение отображения.Я попытался изменить атрибут mappedby, установив его для переменной private Student student;, но он, похоже, не создает этот столбец в базе данных.

JSON, который я получаю в запросе REST, структурирован следующим образом:

"students": [
        {
            "id": 1234,
            "name": "John Doe",
            "location": {
                "id": "5678", 
                "locationName": "St.Mary",
                "street": "Wellington St",
                "postalCode": "41298"
            }
        },
        .
        .
        .
        .
        /* Can have more students here */
    ]

Итак, с точки зрения БД, я хочу, чтобы схема выглядела так:

students
id name location_id

locations
id location_name street postal_code

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

1 Ответ

0 голосов
/ 18 мая 2018

Location - справочная таблица.Справочная таблица должна быть сопоставлена ​​с аннотацией @ManyToOne.Location можно загружать, если это упрощает работу с данными.Но я предпочитаю ленивый подход по умолчанию.Также @JoinColumn не требуется (используется по умолчанию).Но это делает сопоставление более четким и может использоваться для указания имени столбца соединения.Также @ForeignKey аннотация может использоваться для указания имени ограничения внешнего ключа.

@Entity
public class Student {

    @Id
    private Integer id;

    @Column 
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn
    private Location location;

}

@Entity
public class Location {

    @Id
    private Integer id;

    @Column
    private String locationName;

}
...