【问题标题】:Cannot declare List property in the JPA @Entity class. It says 'Basic' attribute type should not be a container无法在 JPA @Entity 类中声明 List 属性。它说“基本”属性类型不应该是容器
【发布时间】:2014-01-30 07:40:08
【问题描述】:

我有一个 JPA @Entity class Place,其中一些属性保存了一些关于地点的信息,例如地点名称、描述和一些图像的 URL。

对于图片的 URL,我在我的实体中声明了 List<Link>

但是,我收到此错误:

Basic attribute type should not be a container.

我尝试删除@Basic,但错误消息仍然存在。为什么会出现这个错误?

【问题讨论】:

  • 任何基本的 JPA(2) 文档都会说字符串列表需要 ElementCollection 注释。至于为什么在使用 Java 时要参考 Python 文档...

标签: java hibernate jpa


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您很可能缺少关系(如@OneToMany)注释和/或@Entity 注释。

    我遇到了同样的问题:

    @Entity
    public class SomeFee {
        @Id
        private Long id;
        private List<AdditionalFee> additionalFees;
        //other fields, getters, setters..
    }
    
    class AdditionalFee {
        @Id
        private int id;
        //other fields, getters, setters..
    }
    

    additionalFees 是导致问题的字段。

    以下是我所缺少的和对我有帮助的:

    1. 泛型类型参数 (AdditionalFee) 类上的 @Entity 注释;
    2. private List&lt;AdditionalFee&gt; additionalFees; 字段上的 @OneToMany(或任何其他类型的适合您的情况的适当关系)注释。

    因此,工作版本如下所示:

    @Entity
    public class SomeFee {
        @Id
        private Long id;
        @OneToMany
        private List<AdditionalFee> additionalFees;
        //other fields, getters, setters..
    }
        
    @Entity
    class AdditionalFee {
        @Id
        private int id;
        //other fields, getters, setters..
    }
    

    【讨论】:

      【解决方案3】:

      该错误似乎对 GAE 没有影响,因为我可以运行应用程序并将数据存储到存储中。我猜这是 IntelliJ IDEA 中的一个错误,您可以直接忽略它。

      【讨论】:

      • 这不是一个错误 - 如果一个实体拥有另一个实体的列表,这意味着“一对多”关系,而不是“基本”字段。如果添加@OneToMany 注解,IDE 中的错误就会消失。
      • @Hesam 我也认为这个答案真的是错误的.. IDE bug 与这个问题无关。
      【解决方案4】:

      你也可以使用@ElementCollection:

      @ElementCollection
      private List<String> tags;
      

      【讨论】:

      • 我用过但标签没有存入数据库
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        将列表类型的 @basic 更改为 @OneToMany

        【讨论】:

          【解决方案7】:

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

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

          1. 保存文件
          2. 关闭并重新打开文件
          3. 清理并重建项目
          4. 重新启动 IDE

          (这些是通用步骤,当 IDE 生成显然没有意义的编译错误时,我会使用这些步骤。)

          【讨论】:

          • 谢谢罗宾,但不幸的是没有工作:(我正在试图找出问题所在。错误消息将通过删除“@Entity(name = "Book")”消失,但是,我认为这不是正确的方法。
          猜你喜欢
          • 1970-01-01
          • 2019-11-26
          • 1970-01-01
          • 1970-01-01
          • 2015-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-10
          相关资源
          最近更新 更多