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;
}
这里的天数为空。 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**
}
]
}
}
答案 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也可能很好看: