【问题标题】:How to populate @Transient field in JPA?如何在 JPA 中填充 @Transient 字段?
【发布时间】:2018-04-09 18:02:56
【问题描述】:

daysCalendar 类中的瞬态变量。 CalendarDay 类通过名为 calendarId 的字段具有对 Calendar 类的外键引用。

当我获取 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;

}

Here Days 为空。 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**
        }
        ]
        }
}

【问题讨论】:

  • 它怎么可能是短暂的和实体的?你的问题完全没有意义。
  • 请编辑您的问题。您想根据 JSON 响应填充天数吗?告诉你需要做的更详细的问题。
  • 或者 response 是把 Calendar 序列化为 JSON 的结果?
  • 我正在尝试整合 www.bryntum.com 的甘特图。我正在使用 Springboot。该组件接受如上所示的 JSON 响应。如果声明不正确,请您帮忙以正确的方式创建所需的 JSON

标签: java hibernate jpa spring-boot transient


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 2011-12-23
    • 2011-03-25
    • 2012-01-22
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多