如何在Google App Engine的数据存储中添加List作为Entity的属性? ('基本'属性类型不应该是容器)

时间:2014-01-11 06:40:54

标签: java google-app-engine jpa intellij-idea google-cloud-datastore

我正在研究我第一次使用GAE。

我有一个“Place”类,其中包含一些属性,这些属性包含一些地方的信息,例如地点名称,关于它的一点描述和一些图像URL。因此,我在类中声明并列出Link的泛型。但是,我得到了“Basic attribute type should not be a container”。我尝试删除@Basic,但错误消息仍然存在。

我记得在MySQL中我应该为图像设计另一个表,并基于placeId链接的位置和图像。我应该按照这种方式吗?

根据我从“Types and Property Classes”找到的内容,可以将List添加为属性,但我不知道为什么会显示错误消息。

enter image description here

===============

更新:我根据他的书Programming Google App Engine中提到的Dan Sanderson设计了我的课程,第300页

enter image description here

7 个答案:

答案 0 :(得分:8)

我知道,这是一个老问题,但是由于它仍然很重要,我将尽力帮助我解决问题。

您很可能会丢失关系(例如@OneToMany)注释和/或@Entity注释。

我在以下方面遇到了同样的问题

@Entity
public class SomeFee {
    @Id
    private Long id;
    private String code;
    private String name;
    private List<AdditionalFee> additionalFees;
    //getters, setters..
}

class AdditionalFee {
    @Id
    private int id;
    //getters, setters..
}

additionalFees是引起问题的字段。

我所缺少的是什么,对我有帮助的是:

    在通用类型参数(@Entity)类上的
  1. AdditionalFee注释;
  2. @OneToMany字段上的
  3. private List<AdditionalFee> additionalFees;(或其他适合您情况的其他适当类型的关系)注释。

因此,工作版本如下所示:
@Entity
public class SomeFee {
    @Id
    private Long id;
    private String code;
    private String name;
    @OneToMany
    private List<AdditionalFee> additionalFees;
    //getters, setters..
}

@Entity
class AdditionalFee {
    @Id
    private int id;
    //getters, setters..
}

答案 1 :(得分:5)

您也可以使用@ElementCollection

@ElementCollection
private List<String> tags;

答案 2 :(得分:3)

将列表类型

更改为@basic@OneToMany

答案 3 :(得分:1)

正如消息所说,@Basic不应该用于容器(例如Java集合)。它仅用于有限的基本类型列表。删除该字段上的@Basic注释。

如果您在问题中说错误信息仍然存在,则可能需要按顺序尝试以下步骤:

  1. 保存文件
  2. 关闭并重新打开文件
  3. 清理并重建项目
  4. 重新启动IDE
  5. (这些是通用步骤,我在IDE生成编译错误时使用这些步骤显然毫无意义。)

答案 4 :(得分:1)

当您的类缺少其@Entity注释时,也会发生这种情况。当您收到类似这些奇怪的警告时,有时尝试编译并查看编译器是否有抱怨会有所帮助。

答案 5 :(得分:0)

好的,错误似乎对GAE没有影响,因为我可以运行应用程序并将数据存储到存储中。我想这是Intellij Idea中的一个错误,你可以忽略它。

enter image description here

答案 6 :(得分:0)

或者如果它不存在于数据库表中,您可以将其标记为 @Transient

@Transient
private List<String> authorities = new ArrayList<>();