假设我有一个名为Photo
的JPA实体类用于存储照片。我还有另一个名为PhotoStatus
的非实体类来保存这些计数信息,例如shareCount
,likeCount
和commentCount
。现在,如果将实例变量(private PhotoStatus status;
)添加到实体类Photo
以保存这些状态信息,则会显示以下错误消息:
基本属性只能是以下类型:Java原语 类型,基本类型的包装器,String,java.math.BigInteger, java.math.BigDecimal,java.util.Date,java.util.Calendar, java.sql.Date,java.sql.Time,java.sql.TimeStamp,byte [],Byte [], char [],Character [],枚举或任何Serializable类型。
为什么会这样?
答案 0 :(得分:2)
如果您阅读了错误消息的这一部分,您将得到答案。
或任何可序列化类型。
您的自定义类(PhotoStatus
)需要实现Serializable
接口。
答案 1 :(得分:2)
如果您希望JPA忽略该特定属性,您应该为其指定@Transient
注释(然后自行管理);如果你想要它持久化,你应该让PhotoStatus
成为一个合适的实体。
答案 2 :(得分:1)
尝试在getter方法中添加@Transient
@Transient
public PhotoStatus getStatus() {
return status;
}
答案 3 :(得分:0)
似乎PhotoStatus
可能是@Embeddable
:
@Entity public class Photo { ... private PhotoStatus status; ... } @Embeddable public class PhotoStatus { private int shareCount; private int likeCount; private int commentCount; }
默认情况下,这会将PhotoStatus
字段映射到Photo
表中具有相同名称的列。要允许您在多个实体中使用嵌入,可以覆盖实体中的默认列名称:
@Entity public class Photo { ... @AttributeOverride(name="shareCount", column=@Column(name = "SHARE")) private PhotoStatus status; ... }