SQLGrammarException:ORA-00904(“无效标识符”)

时间:2013-04-11 00:02:06

标签: java oracle spring hibernate jpa

当我针对使用JPA和Spring的Java类运行JUnit测试时,我收到Oracle错误/ org.hibernate.exception.SQLGrammarException

ORA-00904: "ALIAS"."COLUMN_NAME": invalid identifier

奇怪的是,JUnit测试在针对开发数据库运行时有效,但在针对我用于持续集成构建的数据库运行时失败(它们都是Oracle数据库)。

因此,这表明后者d / b中存在缺失或错误。但是,我进行了双重(和三重)检查,所引用的表在两个数据库中都是相同的,并包含错误所指的列COLUMN_NAME。

更多信息 - 在JUnit测试中调用的DAO Java类使用javax.persistence.EntityManager:

MyClass myObject = entityManager.find(MyClass.class, idNumber);

MyClass JPA实体类映射到Oracle表:

@Configurable
@Entity
@Table(name = "MyTable", schema = "MySchema")
public class MyClass implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
    @SequenceGenerator(name = "MY_SEQ", sequenceName = "MY_SEQ", allocationSize = 1)
    @Column(name = "ID")
    protected BigDecimal id;

    @Column(name = "COLUMN_NAME")
    private String columnName;
    ...
}

两个数据库中数据库表中的COLUMN_NAME列都是VARCHAR2(50)并且可以为空。

版本:

Java - 1.6

春天 - 3.1.1

Oracle - 11.2.0.3.0

提前感谢您的任何帮助。

2 个答案:

答案 0 :(得分:2)

发现问题。我找到了Hibernate正在创建的查询(通过添加

<property name="hibernate.show_sql" value="true" />

到我的data-persistence.xml文件)并尝试在测试失败的数据库中运行它。结果发现,在实体Java类中,关联的数据库表定义如下:

@Table(name = "MyTable", schema = "MySchema")

...对于开发d / b工作正常。但是,持续集成数据库具有在称为其他内容的模式中创建的所有表,因此出现错误。

感谢大家的帮助。

答案 1 :(得分:0)

有同样的问题。原因是我没有添加架构和表名。

@Table(name = "Table", schema = "Schema")