无法执行“ALTER TABLE”,因为表不存在

时间:2010-08-12 15:25:20

标签: java orm jpa eclipselink derby

我正在使用带有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);
  }
}

1 个答案:

答案 0 :(得分:2)

  

表生成策略是“drop-and-create”,为什么Eclipselink告诉我表不存在?

EcliseLink首先删除表约束(您正在看到的alter语句),然后是表,然后重新创建所有内容。由于您使用的是内存数据库,因此实际上没有任何内容可供删除,EclipseLink会将失败的尝试报告为警告。只是忽略它们。