为什么 JPA 实体类不能有自定义实例变量?



假设我有一个名为 Photo 的 JPA 实体类用于存储照片。我还有另一个名为 PhotoStatus 的非实体类来保存这些计数信息,例如 shareCountlikeCountcommentCount 。现在,如果将实例变量 ( private PhotoStatus status; ) 添加到实体类Photo以保存这些状态信息,将显示以下错误消息:

基本属性只能是以下类型: Java 原语 types, 基元类型的包装器, 字符串, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.TimeStamp, byte[], Byte[], char[]、字符 []、枚举或任何可序列化类型。

为什么会这样?

如果你想让

JPA 忽略该特定属性,你应该给它@Transient注释(然后自己管理它);如果你想让它持久化,你应该PhotoStatus成为一个适当的实体。

如果您阅读错误消息的这一部分,您将获得答案。

或任何可序列化类型。

您的自定义类( PhotoStatus ) 需要实现 Serializable 接口。

尝试在getter方法中添加@Transient

@Transient
public PhotoStatus getStatus() { 
  return status;    
}
似乎

PhotoStatus是一个@Embeddable

@Entity公开课照片{    ...    私人照片状态;    ...}@Embeddable公共类 照片状态 {    私人 int shareCount;    私有 int likeCount;    私人 int 评论计数;}

默认情况下,这会将PhotoStatus字段映射到 Photo 表中具有相同名称的列。若要允许您在多个实体中使用可嵌入项,可以覆盖实体中的默认列名称:

@Entity公开课照片{    ...    @AttributeOverride(name="shareCount", column=@Column(name = "SHARE"))    私人照片状态;    ...}

最新更新