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

时间:2013-10-24 09:37:11

标签: java jpa

假设我有一个名为Photo的JPA实体类用于存储照片。我还有另一个名为PhotoStatus的非实体类来保存这些计数信息,例如shareCountlikeCountcommentCount。现在,如果将实例变量(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类型。

为什么会这样?

4 个答案:

答案 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;
    ...
}