如何在JPA中填充@Transient字段?

时间:2017-10-28 06:07:22

标签: java hibernate jpa spring-boot transient

daysCalendar类中的瞬态变量。 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;

}

这里的天数为空。 Calendar类中的days变量是瞬态变量。如何在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**
        }
        ]
        }
}

1 个答案:

答案 0 :(得分:1)

由于@Transient注释days未被保留。从数据库中提取时,它将保持null

瞬态变量是在序列化时忽略的 - java关键字transient - 或持久化 - JPA注释@Transient

这些值可以 - 仅作为示例 - 保存计算的数据或从其他变量派生的其他方式。在这种情况下,值计算一次并存储在变量中,这样就不需要再次计算它,除非计算出的某些值发生变化。

因此,如果我们假设它是@Transient有充分理由你应该以某种方式计算自己获取后days的值。如果假设您希望基于JSON执行此操作,那么您应该 - 例如 - 创建一个从JSON获取必需字段的方法,并根据这些值填充days

如果JSON是序列化类的结果,那么无论如何还要计算days仍然假设它应该是@Transient

但是:正如第一个评论员所说,你所拥有的JPA注释组合并不理智。也许你想删除@Transient注释,这样当你从JSON计算一次值时,你就可以将它们保存到db。 查看更多信息:

Why does JPA have a @Transient annotation?

上面还有关于注释@Transient和关键字transient之间的区别,并且因为您处理JSON也可能很好看:

JPA Transient Annotation and JSON