【问题标题】:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'CONTACTID' in 'field list'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“CONTACTID”
【发布时间】:2014-07-19 18:38:33
【问题描述】:

我使用 EclipseLink 从 MySQL 生成我的所有对象,我有一个名为 CONTACT_ID 的字段。当我尝试em.persist(contact) 时,我收到一条错误消息“Unknown column 'CONTACTID'”。
我搜索了我的项目和数据库,我没有任何名为CONTACTID 的列。 JPA 以某种方式删除了此列名称中的“_”。我确信这真的很愚蠢,我只是不知道为什么。

这是我的数据库设计:

用户.java:

@EmbeddedId
private UserPK id;

private int score;

//bi-directional many-to-one association to CmnContact
@ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn (name="CONTACT_ID")
private CmnContact cmnContact;

//bi-directional many-to-one association to Login
@ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn (name="LOGIN_ID")
private Login login;

CmnContact.java:

@Id
@JoinColumn(name="CONTACT_ID")
private String contactId;
//bi-directional many-to-one association to User
@OneToMany(mappedBy="cmnContact")
private List<User> users;

用户PK.java:

@Column(name="USER_ID")
private UUID userId;

@Column(name="CONTACT_ID", insertable=false, updatable=false)
private UUID contactId;

@Column(name="LOGIN_ID", insertable=false, updatable=false)
private UUID loginId;

【问题讨论】:

  • 看起来 EclipseLink 完全忽略了您的 JPA 字段注释 - 它不仅忽略了 name="CONTACT_ID",而且还忽略了 insertable=false,后者意味着该字段不应在 persist 中使用...您的代码中有其他 JPA 注释吗?它们是否按预期工作?

标签: mysql spring jpa eclipselink


【解决方案1】:

这通常发生在您具有混合访问类型时 - 在属性上有一些注释,在字段上有一些注释。除非您覆盖访问类型,否则提供者将根据它首先找到的注释来选择实体的访问类型,因此将忽略其他。访问类型的一个很好的解释是here

确保您的所有注释在整个模型中都是一致的。

【讨论】:

  • 克里斯,我刚刚上传了我的数据库设计和 EclipseLink 自动生成的 java 代码。你能看一下并告诉我问题吗?谢谢!
  • 在私有字符串contactId上使用Column(name="CONTACT_ID");而不是 JoinColumn(name="CONTACT_ID")。
  • 谢谢你,克里斯!它解决了我的问题。仅供参考,为什么 EclispeLink 使用 JoinColumn 而不是 Column?再次感谢!
  • JoinColumns 用于指定本地表中的列和它在目标表中引用的列 - 用于关系映射。列注释仅用于指定本地表中的列,用于基本映射。因为它是一个基本映射,joincolumn 注释被忽略了,如果日志记录被打开,应该会显示一个警告。
【解决方案2】:

三种可能的解释;

  1. 您正在使用 SQL 脚本生成数据库架构,但列名不匹配(不太可能因为您使用的是 JPA 注释)。
  2. 正如你所说,eclipselink 忽略了列值。

你可以做的事情。启用您的日志记录级别以显示创建表时使用的确切 SQL。单步调试器(我从未使用过 eclipselink,所以我不知道这是否可行)。其他有帮助的事情是发布您的 Spring 配置,以便我们可以看到您如何配置应用程序上下文以及堆栈跟踪(即使它不太可能有帮助,因为您的错误非常具体)

【讨论】:

    【解决方案3】:

    一个原因是您的实体代码中的列名错误。用你的数据库列名检查它。

    【讨论】:

      【解决方案4】:

      由于我使用 mysql 的 jdbc 连接器来连接 JPA(Java 的忍者框架),重新启动服务器,清理和重建代码,删除和输入列工作......我知道点击重置按钮这不是一个真正有效的答案,但如果有人像我一样绝望地修复它,这篇文章可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 2013-02-27
        • 2017-06-27
        • 2016-10-07
        • 2018-05-15
        • 2012-10-13
        • 1970-01-01
        • 2015-03-04
        • 2018-05-12
        • 2015-05-28
        相关资源
        最近更新 更多