我正在使用带有Eclipselink 2的JPA 2和内存数据库中的Derby进行测试。当我开始我的小测试程序时,我得到以下异常:
[EL警告]:2010-08-12 17:17:44.943 - ServerSession(948252856) - 异常[EclipseLink-4002](Eclipse Persistence Services - 2.0.2.v20100323-r6872):org.eclipse。 persistence.exceptions.DatabaseException 内部异常:java.sql.SQLSyntaxErrorException:'ALTER TABLE'无法在'ARTICLE_ARTICLE'上执行,因为它不存在。 错误代码:30000 调用:ALTER TABLE ARTICLE_ARTICLE DROP CONSTRAINT RTCLrtclsRltdTThsD 查询:DataModifyQuery(sql =“ALTER TABLE ARTICLE_ARTICLE DROP CONSTRAINT RTCLrtclsRltdTThsD”)
如果我尝试使用HyperSQL(hsqldb),我会得到:
[EL警告]:2010-08-12 17:47:33.179 - ServerSession(1925661675) - 例外[EclipseLink-4002](Eclipse Persistence Services - 2.0.2.v20100323-r6872):org.eclipse。 persistence.exceptions.DatabaseException 内部异常:java.sql.SQLException:用户缺少未找到的权限或对象:ARTICLE_ARTICLE 错误代码:-5501 调用:ALTER TABLE ARTICLE_ARTICLE DROP CONSTRAINT FK_ARTICLE_ARTICLE_articlesRelatedToThis_ID 查询:DataModifyQuery(sql =“ALTER TABLE ARTICLE_ARTICLE DROP CONSTRAINT FK_ARTICLE_ARTICLE_articlesRelatedToThis_ID”)
表生成策略是“drop-and-create”,为什么Eclipselink告诉我表不存在?
或者我的示例类出了什么问题?
@Entity
public class Article implements Serializable {
@Id @GeneratedValue
private int id;
private String title;
@ManyToMany(mappedBy = "relatedArticles")
private Set<Article> articlesRelatedToThis = new HashSet<Article>();
@ManyToMany(cascade = CascadeType.PERSIST)
private Set<Article> relatedArticles = new HashSet<Article>();
public Article() {}
public Article(String title) {
this.title = title;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Set<Article> getRelatedArticles() {
return relatedArticles;
}
public void addRelatedArticle(Article related) {
relatedArticles.add(related);
}
public void removeRelatedArticle(Article related) {
relatedArticles.remove(related);
}
@PreRemove
public void preRemove() {
for(Article article : articlesRelatedToThis)
article.removeRelatedArticle(this);
}
}
答案 0 :(得分:2)
表生成策略是“drop-and-create”,为什么Eclipselink告诉我表不存在?
EcliseLink首先删除表约束(您正在看到的alter语句),然后是表,然后重新创建所有内容。由于您使用的是内存数据库,因此实际上没有任何内容可供删除,EclipseLink会将失败的尝试报告为警告。只是忽略它们。