Как заполнить поле @Transient в JPA?

days — временная переменная в классе Calendar. Класс CalendarDay имеет ссылку внешнего ключа на класс Calendar через поле с именем calendarId.

Когда я извлекаю объект Calendar, поле days остается пустым. Как я могу заполнить поле?

@Entity
@Table(name = "calendars")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "calendars")
public class Calendar extends Node {

    @Transient
    @OneToMany(fetch = FetchType.EAGER)
    @CollectionTable(name = "calendar_days", joinColumns = @JoinColumn(name = "calendarid"))
    protected List<CalendarDay> days;
    @JsonProperty("Days")
    public List<CalendarDay> getDays() {
       return days;
    }

    @JsonProperty("Days")
    public void setDays(List<CalendarDay> days) {
        this.days = days;
    }
}

@Entity
@Table(name = "calendar_days")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Document(indexName = "calendar_days")
public class CalendarDay extends General {

    @ManyToOne
    @JoinColumn(name = "calendarid")
    protected Calendar calendarId;

}

Здесь дни равны нулю. Переменная days в классе Calendar является временной переменной. Как я могу заполнить эту переходную переменную в JPA?

Ниже приводится ответ:

{"calendars": {
    "rows": [
        {
            "parentId": null,
            "phantomParentId": null,
            "children": null,
            "expanded": false,
            "index": null,
            "leaf": true,
            "Id": 1,
            "Name": "General",
            "DaysPerMonth": 20,
            "DaysPerWeek": 5,
            "HoursPerDay": 8,
            "WeekendsAreWorkdays": false,
            "WeekendFirstDay": 6,
            "WeekendSecondDay": 0,
            "DefaultAvailability": [
                "08:00-12:00",
                "13:00-17:00"
            ],
            **"Days": null**
        }
        ]
        }
}

person user2207300    schedule 28.10.2017    source источник
comment
Как это может быть преходящим и сущностью? Ваш вопрос не имеет абсолютно никакого смысла.   -  person Alan Hay    schedule 28.10.2017
comment
Пожалуйста, отредактируйте свой вопрос. Вы хотите заполнить дни на основе ответа JSON? Расскажите, что вам нужно сделать более подробно в вопросе.   -  person pirho    schedule 28.10.2017
comment
Или, может быть, ответ является результатом сериализации календаря в JSON?   -  person pirho    schedule 28.10.2017
comment
Я пытаюсь интегрировать диаграмму Ганта www.bryntum.com. Я использую Спрингбут. Этот компонент принимает ответ JSON, как показано выше. Если объявление неверно, не могли бы вы помочь с правильным способом создания желаемого JSON   -  person user2207300    schedule 30.10.2017


Ответы (1)


Из-за @Transient аннотации days не сохраняются. Таким образом, при извлечении из базы данных он останется null.

Временные переменные игнорируются при сериализации — ключевое слово java transient — или сохраняются — аннотация JPA @Transient.

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

Поэтому, если мы предполагаем, что это @Transient по уважительной причине, вы должны каким-то образом вычислить значение days после извлечения самостоятельно. Если предполагается, что вы хотите сделать это на основе JSON, вам следует, например, создать метод, который получает необходимые поля из JSON и заполняет days на основе этих значений.

Если JSON является результатом сериализации класса, вам все равно нужно вычислить days каким-то образом, предполагая, что он должен быть @Transient.

НО: как утверждает первый комментатор, комбинация аннотаций JPA, которую вы имеете, не является разумной. Возможно, вы хотите удалить аннотацию @Transient, чтобы при однократном вычислении значений из JSON вы затем сохраняли их в БД. См. дополнительную информацию:

Почему в JPA есть аннотация @Transient?

выше также о разнице между аннотацией @Transient и ключевым словом transient и, поскольку вы имеете дело с JSON, это также может быть полезно прочитать:

Переходная аннотация JPA и JSON

person pirho    schedule 28.10.2017