【发布时间】:2015-04-02 23:23:12
【问题描述】:
我得到一个大的堆栈跟踪,其根源是:java.sql.SQLSyntaxErrorException: Table/View 'U' does not exist. 后跟需要实体的所有内容的异常:java.sql.SQLTransactionRollbackException: Constraint 'PSSVSERSRDTABASEID' is invalid: referenced table U does not exist.
我查看了this question and answer 类似的问题,但它似乎并没有解决我的特定问题。原因是当我在 Eclipse 中打开Database Development 模式时,我可以看到所有其他实体都映射到一个表,但不是实体 User('U')。
用户实体:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "disc", discriminatorType = DiscriminatorType.STRING)
@Table(name = "U")
@NamedQuery(name = "FIND_WITH_USER_ID", query="SELECT DISTINCT u FROM User u WHERE u.userId = :userId")
public class User implements Serializable{
private static final long serialVersionUID = 2468889149889625824L;
@Id @GeneratedValue
protected long databaseId;
//getters/setters/etc
}
用户确实有一个子类(显示在表架构中):
@Entity
public class Customer extends User{
private static final long serialVersionUID = -5239293307816318553L;
public Customer(){
super();
}
//getters/setters/etc
}
在我的 persistence.xml 文件中,如果表不存在,我会指定要创建的表:
<properties>
<property name="javax.persistence.jdbc.driver" value="C:\Program Files\GlassFish\glassfish-4.1\glassfish4\javadb\lib\derby.jar"></property>
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/AppDB;create=true"></property>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
</properties>
如前所述,其他表显示在数据库架构中(并且对数据库的 ping 成功)。问题似乎是围绕用户实体形成的。我认为这可能与保留关键字名称冲突有关,所以我更改了几次表的名称(一旦遇到此异常,Eclipse/Glassfish 似乎有问题,即使我进行了更改,例如作为名称,然后重新启动它不更新的应用程序;我相信超出了问题的范围)。
为什么没有为实体用户创建表?我错过了什么?为什么其他表还在创建中?
【问题讨论】:
-
单词“user”是 ANSI 标准 SQL 中的保留字,因此要在 Derby 中使用它,您必须将其括在双引号中(也称为分隔标识符)。向 Derby 发出 SQL 时,您的对象/关系工具可能没有完全引用用户一词。您可以使用与“用户”不同的名称吗?
-
@Tiny 显然该表不存在!我的问题是:为什么没有为实体用户创建表?。实体名称为 User,对应的表名为 U。我已将其配置为在启动时创建表(persistence.xml 文件)。除了用户(表名“U”)之外,所有其他表都已创建(有问题)。
-
@BryanPendleton 是的,我知道“用户”这个词是保留字,因此是
@table(name = "U") annotation。这会更改表名,因此持久性提供程序会将实体映射到表 U。类名 User 应该与映射无关,因为我指定了table注释。我相信我的错误在于持久性提供程序的其他地方。我只是不确定在哪里。 -
如果将
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />替换为<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />会怎样? -
使用“-Dderby.language.logStatementText=true”运行 Derby,然后查看 derby.log 文件以查看向 Derby 发出的 SQL 语句以及返回的错误。
标签: java jakarta-ee jpa eclipselink derby