EclipseLink DataModifyQuery 不会抛出致命异常

Posted

技术标签:

【中文标题】EclipseLink DataModifyQuery 不会抛出致命异常【英文标题】:EclipseLink DataModifyQuery does not throw fatal exception 【发布时间】:2021-01-27 07:49:01 【问题描述】:

我正在使用 SQLServer,并且我有一个实体“注册”,其中包含学生(学生)作为多对一关系。 我尝试将学生列名称设置为“USER”,这是一个 SQL 保留关键字。

我还设置了eclipselink.ddl-generation=drop-and-create-tables,它将删除并创建表。

注意:我知道保留的 SQL 关键字可以用 [USER] 或 "USER" 进行转义

@ManyToOne
@JoinColumn(name = "USER")
private Student student;

当我执行测试主代码时,我确实从 EclipseLink 得到了一个 DatabaseException,并且没有创建表。但是,代码成功执行,没有抛出任何停止执行的致命异常。

它确实抛出了Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'USER'.,但我希望它会失败。

这是 EclipseLink 本身的错误还是有任何配置使其失败?

请参阅下面的完整日志:

[EL Warning]: 2021-01-27 14:54:12.789--ServerSession(231311211)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'USER'.
Error Code: 156
Call: CREATE TABLE ENROLLMENT (ENROLLMENT_KEY NUMERIC(19) NOT NULL, COURSE_KEY NUMERIC(19) NULL, USER NUMERIC(19) NULL, PRIMARY KEY (ENROLLMENT_KEY))
Query: DataModifyQuery(sql="CREATE TABLE ENROLLMENT (ENROLLMENT_KEY NUMERIC(19) NOT NULL, COURSE_KEY NUMERIC(19) NULL, USER NUMERIC(19) NULL, PRIMARY KEY (ENROLLMENT_KEY))")
[EL Warning]: 2021-01-27 14:54:12.797--ServerSession(231311211)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot find the object "ENROLLMENT" because it does not exist or you do not have permissions.
Error Code: 4902
Call: ALTER TABLE ENROLLMENT ADD CONSTRAINT ENROLLMENT_COURSE_KEY FOREIGN KEY (COURSE_KEY) REFERENCES COURSE (COURSE_KEY)
Query: DataModifyQuery(sql="ALTER TABLE ENROLLMENT ADD CONSTRAINT ENROLLMENT_COURSE_KEY FOREIGN KEY (COURSE_KEY) REFERENCES COURSE (COURSE_KEY)")
[EL Warning]: 2021-01-27 14:54:12.802--ServerSession(231311211)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'STUDENT_SEQ'.
Error Code: 208
Call: SELECT NEXT VALUE FOR STUDENT_SEQ
Query: ValueReadQuery(sql="SELECT NEXT VALUE FOR STUDENT_SEQ")
[EL Warning]: 2021-01-27 14:54:12.806--ServerSession(231311211)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'COURSE_SEQ'.
Error Code: 208
Call: SELECT NEXT VALUE FOR COURSE_SEQ
Query: ValueReadQuery(sql="SELECT NEXT VALUE FOR COURSE_SEQ")
[EL Warning]: 2021-01-27 14:54:12.81--ServerSession(231311211)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.8.v20201217-ecdf3c32c4): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'ENROLLMENT_SEQ'.
Error Code: 208
Call: SELECT NEXT VALUE FOR ENROLLMENT_SEQ
Query: ValueReadQuery(sql="SELECT NEXT VALUE FOR ENROLLMENT_SEQ")

【问题讨论】:

【参考方案1】:

表创建是一个不错的功能,但语句可能会由于任何非失败的正当原因而出现问题,而 EclipseLink 无法,甚至无法尝试区分。

如果您想让它在启动时表/字段不存在时失败,请尝试添加会话定制器以添加验证,如下所述:https://wiki.eclipse.org/EclipseLink/Examples/JPA/IntegrityChecker 我不记得示例代码中的 get 是否有效,因为我的本地代码使用验证创建了一个新的 org.eclipse.persistence.exceptions.IntegrityChecker 实例,我将它添加到会话中。这将检查每个实体并验证映射中的列是否存在,并提供详细说明可能缺少的内容的输出。

【讨论】:

以上是关于EclipseLink DataModifyQuery 不会抛出致命异常的主要内容,如果未能解决你的问题,请参考以下文章

Eclipselink 2.5 使用 Maven 生成元模型

EclipseLink 错误?简单的原生 SQL 查询异常

Eclipselink 实体类自动扫描发现非实体

Eclipselink 实体持续存在问题

eclipselink 连接池

eclipselink.weaving 属性的值和区别是啥?