我使用EclipseLink从MySQL生成所有对象,我有一个名为CONTACT_ID
的字段。当我尝试em.persist(contact)
时,我得到一个错误的消息说“Unknown column 'CONTACTID'
”
我搜索了我的项目和数据库,我没有任何名为CONTACTID
的列。不知何故,JPA删除了此列名称中的“_”。我确信这是非常愚蠢的事情,我无法找出原因。
这是我的数据库设计:
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;
答案 0 :(得分:2)
当您具有混合访问类型时,通常会发生这种情况 - 在属性上有一些注释,在字段上有一些注释。除非您覆盖访问类型,否则提供程序将根据它首先找到的注释来选择实体的访问类型,因此将忽略其他类型。对访问类型的一个很好的解释是here
确保所有注释在整个模型中都是一致的。
答案 1 :(得分:0)
三种可能的解释;
你可以做的事情。启用日志记录级别以显示创建表时使用的确切SQL。逐步调试(我从未使用过eclipselink,因此我不知道这是否可行)。其他有用的方法是发布你的Spring配置,这样我们就可以看到你如何配置你的应用程序上下文以及堆栈跟踪(尽管它不太可能有用,因为你的错误是非常具体的)
答案 2 :(得分:0)
一个原因是您的列名在您的实体代码中是错误的。使用数据库列名检查它。
答案 3 :(得分:0)
由于我使用mysql的jdbc连接器连接JPA(Java的ninja框架),重新启动服务器,清理和重建代码,删除和输入列工作......我知道按下重置按钮这不是一个真正有效的答案,但如果有人像我一样绝望,那么这篇文章可能有所帮助。