当前位置: 首页 > 知识库问答 >
问题:

EclipseLink DataModifyQuery不会引发致命异常

仲和韵
2023-03-14

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

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

注意:我知道保留的SQL关键字可以用[USER]或“USER”转义。

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

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

它确实抛出了异常:com.microsoft.sqlserver.jdbc.sqlserverException:关键字“user”附近的语法不正确。但我希望它会失败。

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

请参阅以下完整日志:

[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个答案

司空健
2023-03-14

表创建是一个很好的特性,但是语句可能会因为许多不是失败的有效原因而出现问题,而EclipseLink不能,甚至真的试图区分其中的区别。

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

 类似资料:
  • 问题内容: 我已经坚持了好几个星期,而且我没有最模糊的想法出了什么问题。我已经很浪费了,因为我已经浪费了很多时间 我使用下面描述的数据模型(MySQL)。我已经通过反向工程(Eclipse / JBoss Tools)创建了hbm.xml和java类(请参见下面的示例)。 当我尝试保存推文,单词或事件时,我可以在日志消息中看到生成了pk值并且正确绑定了参数,但是没有任何内容写入数据库。(请参阅帖子

  • 问题内容: 我在接口抛出异常的地方读了这段代码,但是实现它的类却没有抛出异常或捕获异常,这是为什么呢?在Java中合法或安全吗? 问题答案: 实现和扩展的一般规则是,您可以使新类或接口的限制较少,而不能限制较多。如果您认为将异常作为限制进行处理的要求,则未声明异常的实现的限制性较小。对该接口进行编码的任何人都不会遇到您的课的麻烦。 -斯坦·詹姆斯 作为http://www.coderanch.co

  • 问题内容: 我正在使用JAXB XMLadapter来编组和解组布尔值。C#应用程序也将访问该应用程序的XML文件。我们必须验证此XML文件,这是使用XSD完成的。C#应用程序为布尔节点写入“ True”值。但是我们的XSD确实验证了同样的结果,因为它只允许“ true / false”或“ 1/0”。因此,我们在XSD中将String保留为布尔值,并且XMLAdapter会验证该字符串是否在我们

  • 问题内容: 我有以下代码,我希望它抛出,但运行成功。为什么会这样? 问题答案: 的上方法删除指定位置的元素。在开始循环之前,您的列表如下所示: 然后,在列表上启动迭代器: 您的环然后删除 位置1处的元件 ,这是数字2: 在下一个隐式调用上,迭代器返回,然后循环终止。 如果将更多元素添加到列表中,则会得到一个。然后隐式将抛出。 请注意,从Javadoc 到JCF: 注意,迭代器的快速失败行为无法得到

  • 我正在使用Jackson2.2注释@JSONProperty,其中required设置为true。在通过ObjectMapper readValue()方法反序列化不包含该属性的json文件时,不会引发异常。它应该以不同的方式工作还是我错过了什么? 我希望这样做,因为在json文件中没有指定_name,并且需要抛出异常。

  • CreateDB:无法连接到数据库Postgres:Fatal:数据库“Postgres”不存在 我对PostgreSQL是新手。你能指导我经历这个错误吗?简单地说,我想在PSQL上创建一个数据库。