【问题标题】:Hibernate mapping internal class, Error "Could not determine type for: timeStamps"Hibernate 映射内部类,错误“无法确定类型:timeStamps”
【发布时间】:2018-12-29 13:35:17
【问题描述】:

我有实体“任务”,它需要一个名为“时间戳”的内部组件,该组件保存任务提交、开始和完成的时间值。

@Entity
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer Id;
    private String Status;
    private Timestamps timestamps;
    // getters setters
}

然后我创建了 Timestamps 类

public class Timestamps {
 private Timestamp submitted;
 private Timestamp started;
 private Timestamp completed;
 //getter and setters
}

如何进行此映射,以便当我以 JSON 格式检索信息时,我会得到类似的信息?

# task
{
    "task": # ASCII string
    "status": # one of "submitted", "started", "completed"
    "timestamps": {
    "submitted": # unix/epoch time
    "started": # unix/epoch time or null if not started
    "completed": # unix/epoch time or null if not completed
    }
}

【问题讨论】:

  • @Spara 它不起作用:我得到“没有为实体指定标识符:com.tasks.Timestamps”
  • 如果您不想在数据库中保留时间戳,您可以使用@Transient。如果您想将 Timestamps 作为关系保留在 DB 中,您应该将其作为具有标识符的实体,然后是与任务实体的 @ManyToOne 关系

标签: java json hibernate jpa


【解决方案1】:

您可以将@Embeddable 注解放在时间戳上。 Hibernate 会将字段映射为同一表中的列。 您可能还需要在 Task 的 Timestamps 字段上使用 @Embedded(如果双方都需要注释,我无法确定)。

【讨论】:

    【解决方案2】:

    如果您不想将Timestamps 保留在 DB 中,而只是在 DTO 中使用它,这将对您有所帮助:

    @Transient注解用于表示某个字段不被持久化到数据库中。

    @Entity
    public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer Id;
    private String Status;
    @Transient
    private Timestamps timestamps;
    // getters setters
    }
    

    如果您想将Timestamps 保留为关系,您应该执行以下操作:

    @Entity
    public class Timestamps {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer Id;
     private Timestamp submitted;
     private Timestamp started;
     private Timestamp completed;
     //getter and setters
    }
    
    @Entity
    public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer Id;
    private String Status;
    @ManyToOne
    private Timestamps timestamps;
    // getters setters
    }
    

    【讨论】:

    • 有点用。但是,我希望将时间戳作为任务列保存在数据库中。烦人的是我需要以这种特定格式制作 JSON。
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多