EclipseLink DataModifyQuery 不会抛出致命异常
EclipseLink DataModifyQuery does not throw fatal exception
我正在使用 SQLServer 并且我有一个包含学生 (Student) 作为 ManyToOne 关系的实体“Enrollment”。
我尝试将学生列名称设置为“USER”,这是一个 SQL 保留关键字。
我还设置了 eclipselink.ddl-generation=drop-and-create-tables
,它会掉落并创建 table。
注意:我知道保留的 SQL 关键字可以用 [USER] 或“USER”转义
@ManyToOne
@JoinColumn(name = "USER")
private Student student;
当我执行测试主代码时,我确实从 EclipseLink 得到了一个 DatabaseException 并且 table 没有被创建。但是,代码成功执行,没有抛出任何停止执行的致命异常。
它确实抛出 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")
Table 创建是一个不错的功能,但语句可能会因为任何非失败的正当理由而出现问题,而 EclipseLink 不能,甚至不能尝试,来区分它们。
如果启动时 tables/fields 不存在,如果你想让它失败,请尝试添加会话定制器以添加验证,如下所述:https://wiki.eclipse.org/EclipseLink/Examples/JPA/IntegrityChecker
我不记得示例代码中的 get 是否有效,因为我使用验证的本地代码创建了一个 org.eclipse.persistence.exceptions.IntegrityChecker 的新实例,我将其添加到会话中。这将检查每个实体并验证映射中的列是否存在,并提供详细说明可能缺少的内容的输出。
我正在使用 SQLServer 并且我有一个包含学生 (Student) 作为 ManyToOne 关系的实体“Enrollment”。 我尝试将学生列名称设置为“USER”,这是一个 SQL 保留关键字。
我还设置了 eclipselink.ddl-generation=drop-and-create-tables
,它会掉落并创建 table。
注意:我知道保留的 SQL 关键字可以用 [USER] 或“USER”转义
@ManyToOne
@JoinColumn(name = "USER")
private Student student;
当我执行测试主代码时,我确实从 EclipseLink 得到了一个 DatabaseException 并且 table 没有被创建。但是,代码成功执行,没有抛出任何停止执行的致命异常。
它确实抛出 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")
Table 创建是一个不错的功能,但语句可能会因为任何非失败的正当理由而出现问题,而 EclipseLink 不能,甚至不能尝试,来区分它们。
如果启动时 tables/fields 不存在,如果你想让它失败,请尝试添加会话定制器以添加验证,如下所述:https://wiki.eclipse.org/EclipseLink/Examples/JPA/IntegrityChecker 我不记得示例代码中的 get 是否有效,因为我使用验证的本地代码创建了一个 org.eclipse.persistence.exceptions.IntegrityChecker 的新实例,我将其添加到会话中。这将检查每个实体并验证映射中的列是否存在,并提供详细说明可能缺少的内容的输出。