com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列' CONTACTID'在'字段列表'

时间:2014-05-30 04:44:32

标签: mysql spring jpa eclipselink

我使用EclipseLink从MySQL生成所有对象,我有一个名为CONTACT_ID的字段。当我尝试em.persist(contact)时,我得到一个错误的消息说“Unknown column 'CONTACTID'” 我搜索了我的项目和数据库,我没有任何名为CONTACTID的列。不知何故,JPA删除了此列名称中的“_”。我确信这是非常愚蠢的事情,我无法找出原因。

这是我的数据库设计: enter image description here

User.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;

UserPK.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;

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

三种可能的解释;

  1. 您正在使用SQL脚本生成数据库架构,并且列名称不匹配(因为您使用JPA注释时不太可能)。
  2. 如您所说,eclipselink忽略了列值。
  3. 你可以做的事情。启用日志记录级别以显示创建表时使用的确切SQL。逐步调试(我从未使用过eclipselink,因此我不知道这是否可行)。其他有用的方法是发布你的Spring配置,这样我们就可以看到你如何配置你的应用程序上下文以及堆栈跟踪(尽管它不太可能有用,因为你的错误是非常具体的)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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