【问题标题】:EclipseLink DataModifyQuery does not throw fatal exceptionEclipseLink DataModifyQuery 不会抛出致命异常
【发布时间】: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")

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2015-02-21
      • 1970-01-01
      相关资源
      最近更新 更多