Hibernate,InteliJ - 生成持久性映射,不正确的表名

Posted

技术标签:

【中文标题】Hibernate,InteliJ - 生成持久性映射,不正确的表名【英文标题】:Hibernate, InteliJ - generate persistence mapping, incorrect table name 【发布时间】:2019-03-22 02:15:04 【问题描述】:

我正在使用带有 InteliJ Idea 终极版的休眠,每次我尝试生成我的表的持久性映射时,它都会使用稍微不正确的 @Table 名称生成它们

My database structure - IMGUR IMAGE

所以我对“Activity”表的正确表名是:“[dbo].[Activity]”

但 InteliJ 会像这样生成它:

@Table(name = "Modules", schema = "dbo", catalog = "test-V4ClientDb")

它会导致无法检索数据的错误:

错误:“-”附近的语法不正确。 org.hibernate.exception.SQLGrammarException:无法提取 结果集 在 org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:434) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:186) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:121) 在 org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86) 在 org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167) 在 org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4004) 在 org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508) 在 org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478) 在 org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 在 org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278) 在 org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) 在 org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 在 org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1220) 在 org.hibernate.internal.SessionImpl.access $1900(SessionImpl.java:203) 在 org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2767) 在 org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2741) 在 org.hibernate.internal.SessionImpl.get(SessionImpl.java:1056) 在 hibernate.DatabaseManager.retrieveModuleFromDatabase(DatabaseManager.java:82) 在 hibernate.DatabaseManager.populateDatabase(DatabaseManager.java:58) 在 runner.TestRunner.setUp(TestRunner.java:30) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 在 org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:363) 在 cucumber.api.junit.Cucumber.run(Cucumber.java:100) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:137) 在 org.junit.runner.JUnitCore.run(JUnitCore.java:115) 在 org.testng.junit.JUnit4TestRunner.start(JUnit4TestRunner.java:81) 在 org.testng.junit.JUnit4TestRunner.run(JUnit4TestRunner.java:69) 在 org.testng.TestRunner$1.run(TestRunner.java:697) 在 org.testng.TestRunner.runJUnitWorkers(TestRunner.java:1004) 在 org.testng.TestRunner.privateRunJUnit(TestRunner.java:728) 在 org.testng.TestRunner.run(TestRunner.java:629) 在 org.testng.SuiteRunner.runTest(SuiteRunner.java:366) 在 org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) 在 org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) 在 org.testng.SuiteRunner.run(SuiteRunner.java:268) 在 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 在 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 在 org.testng.TestNG.runSuitesSequentially(TestNG.java:1244) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1169) 在 org.testng.TestNG.run(TestNG.java:1064) 在 org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:135) 在 org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeSingleClass(TestNGDirectoryTestSuite.java:112) 在 org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:99) 在 org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:146) 在 org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:383) 在 org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:344) 在 org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125) 在 org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:417) 引起:com.microsoft.sqlserver.jdbc.SQLServerException:不正确 '-' 附近的语法。 在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:254) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1608) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:578) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:508) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7240) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2869) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:243) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:218) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:434) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:70) ... 56 更多

是否有可能将 InteliJ 配置为使用正确的命名?

我正在使用 Microsoft Azure sql server。

谢谢。

编辑

如果没有指定“目录”,它也可以工作

@Table(name = "Modules", schema = "dbo")

所以问题仍然是,如何配置 InteliJ 休眠工具以使用正确的命名。

【问题讨论】:

您能否添加有关您遇到的错误的信息? 你好 Andrey,我已经编辑了我的帖子并添加了完整的错误日志,谢谢。 我认为没有单独的选项。请随意投票/关注IDEA-200824 请求。 【参考方案1】:

看起来您不能在目录字符串中使用字符“-”。

【讨论】:

以上是关于Hibernate,InteliJ - 生成持久性映射,不正确的表名的主要内容,如果未能解决你的问题,请参考以下文章

(转) Hibernate持久化类与主键生成策略

hibernate框架持久化类&主键生成策略

在使用 Hibernate 持久性提供程序的 AUTO、IDENTITY 和 TABLE(或任何其他最佳方法)中,哪种生成类型最好?

hibernate由表生成持久化类和映射文件

持久层框架--hibernate

JavaEE持久层框架对比与hibernate主键生成策略总结