Spring JPA с Hibernate обрабатывает нулевые дочерние объекты при наличии соединения с внешним ключом - PullRequest
2 голосов
/ 25 февраля 2020

Допустим, у меня есть две таблицы: ученик и класс. Идентификатор класса - это внешний ключ в таблице учеников. Столбец идентификатора класса для некоторых студентов также может быть пустым (значит, им не назначен класс). Если мы будем использовать Spring jpa для извлечения данных для таких студентов, тогда объект сущности класса будет нулевым. Я бы предпочел, чтобы пустой объект вместо пустого, чтобы избежать ручных проверок нуля. Как мне этого добиться?

Ученик - Идентификатор ученика, Имя, Возраст, Идентификатор класса
Ученик - Идентификатор класса, Имя класса, Назначенное имя учителя

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Как бы то ни было, вы заканчиваете прямой или непрямой ручной проверкой.

Может помочь выборка записей как java 8.

Когда вы используете доступ по типу поля, вы можете реализовать методы getter и setter по-своему. Например, вы можете реализовать метод getMyValue (), который оборачивает атрибут myValue в необязательный

@Entity
public class SomeClass {

...

@Column
private String myValue;

 ...

 public Optional getMyValue() {
    return Optional.ofNullable(myValue);
 }

 public void setMyValue(LocalDate myValue) {
    this.myValue= myValue;
 }
...
}

. В Hibernate 5.2 также введен метод loadOptional (Serializable id) для * 1010. * IdentifierLoadAccess интерфейс, который возвращает Необязательный. Вы должны использовать этот метод, чтобы указать, что результат может быть пустым, если вы не уверены, что база данных содержит запись с предоставленным идентификатором

0 голосов
/ 25 февраля 2020

Вы можете использовать метод @PostLoad, чтобы установить для класса какое-нибудь фиктивное значение после загрузки ученика. Но вы не должны сохранять эту сущность, потому что JPA попытается сохранить этот фиктивный экземпляр.

Поэтому я бы go сделал бы полное расстояние и создал бы строку в базе данных для NO_CLASS, вместо того, чтобы иметь нулевой идентификатор ссылаться на этот ряд. Таким образом, ваша объектная модель соответствует модели данных.

0 голосов
/ 25 февраля 2020

Изменение довольно тривиально и просто старое Java. Я также делаю это для коллекций в моих приложениях JPA.

Просто сделайте нулевую проверку в получателе объекта.

    public Class getClass() {
        if (null == this.myClass) {
            return new Class(); // assuming the default constructor resembles an empty class
        }
        return this.myClass;
    }

Если нет реального "пустого" Class в вместо вашего кода просто верните Optional<Class>.

РЕДАКТИРОВАТЬ: Между прочим, использование «класса» - довольно опасная идея для имени, поскольку оно конфликтует с ключевым словом Java class.

...