2015-04-02 305 views
1

我得到它从根本上是造成了大量的堆栈跟踪:需要实体java.sql.SQLSyntaxErrorException: Table/View 'U' does not exist.其次是一切例外:java.sql.SQLTransactionRollbackException: Constraint 'PSSVSERSRDTABASEID' is invalid: referenced table U does not exist.SQLSyntaxErrorException:表/视图不存在

我看着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> 

如前所述,其他表格显示在数据库模式ma(并且ping到数据库成功)。问题似乎围绕用户实体形成。我认为它可能与保留的关键字名称冲突有关,所以我更改了表名的几次(在我遇到此异常后,似乎遇到了Eclipse/Glassfish的问题,即使我进行了更改,例如作为名称,并重新启动它不更新的应用程序;超出了我相信的问题范围)。

为什么不为实体用户创建表?我错过了什么?为什么其他表格仍然被创建?

+0

单词“用户”是ANSI标准SQL保留字,所以用德比来使用它,你必须把它们放在双引号(又名分隔标识符)。也许你的对象/关系工具在向Derby发出SQL时没有完全引用User这个词。你可以使用不同于“用户”的名字吗? – 2015-04-03 00:49:02

+0

@Tiny很明显,表格不存在!我的问题是:**为什么不为实体用户?**创建表。实体名称是User,对应的表名为U.我已经将它配置为在启动时创建表(persistence.xml文件)。除用户(表名'U')外,其他所有表格均创建(有问题)。 – chRyNaN 2015-04-03 04:11:25

+0

@BryanPendleton是的我知道单词“用户”是一个保留字,因此'@table(name =“U”)注释'。这会更改表名,以便持久性提供程序将实体映射到表U.因为我指定了'table'注释,所以类名称User应与映射无关。我相信我的错误在于持久性提供者。我只是不确定在哪里。 – chRyNaN 2015-04-03 04:22:09

回答

0

问题出在你的SQL脚本上,你正在传递表别名而不是列名。它应该是你。

SELECT DISTINCT e.emp_id FROM EMPË

+0

你能详细点吗?你在谈论我在Entity上指定的NamedQuery吗?如果是这样,这是一个有效的JPQL语句。 – chRyNaN 2015-04-03 00:21:54

+0

我遇到了同样的问题,原因是表名的别名。在你的情况下,你已经将它定义为“:U” 试试这个 SELECT DISTINCT u FROM User as u WHERE u.userId =:userId – 2015-04-03 00:43:36

+0

它与查询语句无关。我在应用程序启动时收到错误消息。如果我想要获得用户实例并且正确的话,那么@NamedQuery就可以用于以后使用。 – chRyNaN 2015-04-03 04:08:28

相关问题