gpt4 book ai didi

java - hibernate auto create in-memory hsqldb 导致找不到序列

转载 作者:行者123 更新时间:2023-11-29 04:00:28 25 4
gpt4 key购买 nike

我正在使用 hibernate 作为我的 jpa 提供程序并希望它创建一个启动时使用内存中的 hsqldb:hibernate.hbm2ddl.auto=创建

但出于某种原因,我在日志中收到如下所示的异常。事情似乎并非如此。是hibernate还是hsqldb的问题?

我仅限于使用 jpa 1,所以我正在使用hsqldb 1.8.0.10 和 hibernate 3.3.0.SP1

这类似于: Internal HSQL database complains about privileges

ERROR - 4. Statement.executeUpdate(drop sequence DDS_EMAIL_STATUS_SEQ) FAILED! drop sequence DDS_EMAIL_STATUS_SEQ {FAILED after 0 msec}java.sql.SQLException: Sequence not found in statement [drop sequence DDS_EMAIL_STATUS_SEQ]    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)    at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)    at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)    at net.sf.log4jdbc.StatementSpy.executeUpdate(StatementSpy.java:694)    at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)    at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:383)    at org.hibernate.tool.hbm2ddl.SchemaExport.drop(SchemaExport.java:358)    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:258)    at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:211)    at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:343)    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327)    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132)    at org.apache.openejb.assembler.classic.PersistenceBuilder.createEntityManagerFactory(PersistenceBuilder.java:184)    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:490)    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:450)    at org.apache.openejb.assembler.classic.Assembler.buildContainerSystem(Assembler.java:368)    at org.apache.openejb.assembler.classic.Assembler.build(Assembler.java:280)    at org.apache.openejb.OpenEJB$Instance.(OpenEJB.java:125)    at org.apache.openejb.OpenEJB$Instance.(OpenEJB.java:60)    at org.apache.openejb.OpenEJB.init(OpenEJB.java:271)    at org.apache.openejb.OpenEJB.init(OpenEJB.java:250)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)    at java.lang.reflect.Method.invoke(Method.java:597)    at org.apache.openejb.loader.OpenEJBInstance.init(OpenEJBInstance.java:36)    at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:71)    at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:53)    at org.apache.openejb.client.LocalInitialContextFactory.getInitialContext(LocalInitialContextFactory.java:42)    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)    at javax.naming.InitialContext.init(InitialContext.java:223)    at javax.naming.InitialContext.(InitialContext.java:197)

最佳答案

由于您使用的是内存数据库,因此与任何其他数据库对象一样,序列在导出时不存在也就不足为奇了。但我不知道为什么你会得到这样的完整堆栈跟踪。我刚刚尝试了一个基本的测试用例,这是我得到的:

16:27:07.708 [main] DEBUG o.h.tool.hbm2ddl.SchemaExport - Unsuccessful: drop sequence MY_ENTITY_SEQ16:27:07.709 [main] DEBUG o.h.tool.hbm2ddl.SchemaExport - Sequence not found in statement [drop sequence MY_ENTITY_SEQ]

In other words, it "fails" silently.

Maybe you could try to extend the HSQLDialect and override the following method:

protected String getDropSequenceString(String sequenceName) {
return "drop sequence " + sequenceName;
}

进入:

protected String getDropSequenceString(String sequenceName) {
return "drop sequence " + sequenceName + " if exists";
}

虽然没有测试。

关于java - hibernate auto create in-memory hsqldb 导致找不到序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com