Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
D'oh, I ran the tests with version 1.4.199 the first time, they're still failing with 2.2.224, but I'm getting another error now (column names that are reserved words). I can probably fix that. Anyway, thanks for your help. On Wed, Oct 25, 2023 at 3:45 PM Knut Skomedal wrote: > > Thanks, changing the user in the JdbcDataSource definition solved the > problem. My tests are now running. > > With regards, > > Knut > > > On Wed, Oct 25, 2023 at 3:10 PM Noel Grandin wrote: > > > > I think it's because you are using a username of "PUBLIC", which conflicts > > with something we have changed (not sure what). > > > > "PUBLIC" is the name of the default schema and the default role, so it is > > no surprise that it conflicts. > > > > Probably we should be throwing a better error message in that case. -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to h2-database+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/h2-database/CAGoHhQ-8YLEj7jFqSmTwgeCAKc9M13KsKC86x%2B%3DyotZdewT09Q%40mail.gmail.com.
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
Thanks, changing the user in the JdbcDataSource definition solved the problem. My tests are now running. With regards, Knut On Wed, Oct 25, 2023 at 3:10 PM Noel Grandin wrote: > > I think it's because you are using a username of "PUBLIC", which conflicts > with something we have changed (not sure what). > > "PUBLIC" is the name of the default schema and the default role, so it is no > surprise that it conflicts. > > Probably we should be throwing a better error message in that case. -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to h2-database+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/h2-database/CAGoHhQ-dRshFNWqh8sJmaAEe_GS0B6j_njP2aQT152hM%2B2BMfw%40mail.gmail.com.
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
I think it's because you are using a username of "PUBLIC", which conflicts with something we have changed (not sure what). "PUBLIC" is the name of the default schema and the default role, so it is no surprise that it conflicts. Probably we should be throwing a better error message in that case. -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to h2-database+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/h2-database/8f4b2072-dc0d-46f9-a800-cce5be1660e7%40gmail.com.
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
When I'm running 1.4.199 the execution ends in the same method for addDatabaseObject(Session session, DbObject obj) which seems unchanged with a casual glance. session = {Session} "#0 (user: DBA)" serialId = 0 database = {Database} "SVIFT:org.h2.engine.Database" connectionInfo = null user = {User} "DBA:0:org.h2.engine.User" id = 1 locks = {ArrayList} size = 1 undoLog = null autoCommit = true random = null lockTimeout = 2000 lastIdentity = {ValueLong} "0" lastScopeIdentity = {ValueLong} "0" lastTriggerIdentity = null generatedKeys = null firstUncommittedLog = -1 firstUncommittedPos = -1 savepoints = null localTempTables = null localTempTableIndexes = null localTempTableConstraints = null throttleNs = 0 lastThrottle = 0 currentCommand = null allowLiterals = false currentSchemaName = "PUBLIC" schemaSearchPath = null trace = null removeLobMap = null systemIdentifier = 0 procedures = null undoLogEnabled = true redoLogBinary = true autoCommitAtTransactionEnd = false currentTransactionName = null cancelAtNs = 0 sessionStart = 1698238342161 transactionStart = null currentCommandStart = null variables = null temporaryResults = null queryTimeout = 0 commitOrRollbackDisabled = false waitForLock = null waitForLockThread = null modificationId = 0 objectId = 0 queryCacheSize = 8 queryCache = null modificationMetaID = -1 subQueryInfo = null viewNameStack = null preparingQueryExpression = 0 viewIndexCache = null subQueryIndexCache = null joinBatchEnabled = false forceJoinOrder = false lazyQueryExecution = false columnNamerConfiguration = {ColumnNamerConfiguration} tablesToAnalyze = null temporaryResultLobs = null temporaryLobs = null transaction = null state = {AtomicReference} "INIT" startStatement = -1 idsToRelease = null sessionState = null sessionStateChanged = true sessionStateUpdating = false obj = {User} "PUBLIC:2:org.h2.engine.User" systemUser = false salt = {byte[8] passwordHash = {byte[32] admin = true grantedRoles = null grantedRights = null database = {Database} "SVIFT:org.h2.engine.Database@691500ab" trace = {Trace} comment = null id = 2 objectName = "PUBLIC" modificationId = 1 temporary = false The getMap() method returns the content of the Database.user variable which has no content. name is still "PUBLIC" thus the test in if (SysProperties.CHECK && map.get(name) != null) isn't true and no exception is thrown. On Wednesday, 25 October 2023 at 14:46:55 UTC+2 Knut Skomedal wrote: > I've debugged the last part of the process where hibernate tries to get a > connection to the database, starting with a breakpoint > in org.h2.engine.Engine.createSession(Engine.java:201) > > public static SessionLocal createSession(ConnectionInfo ci) { > try { > SessionLocal session = openSession(ci); > > ci = {ConnectionInfo} > prop = {Properties} size = 5 <-- The properties are parsed correctly > from the original url. > "LOCK_TIMEOUT" -> "6" > "DB_CLOSE_DELAY" -> "-1" > "MODE" -> "Oracle" > "DB_CLOSE_ON_EXIT" -> "FALSE" > "TRACE_LEVEL_SYSTEM_OUT" -> "0" > originalURL = > "jdbc:h2:mem:SVIFT;MODE=Oracle;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=0;LOCK_TIMEOUT=6;DB_CLOSE_ON_EXIT=FALSE" > url = "jdbc:h2:mem:SVIFT" > user = "PUBLIC" > name = "mem:SVIFT" > > This runs to L222: session = openSession(ci, ifExists, forbidCreation, > cipher); > ifExists (slot_1) = 0 > forbidCreation (slot_2) = 0 > ignoreUnknownSetting (slot_3) = 0 > cipher (slot_4) = null > > Then to L107: > if (!found) { > // users is the last thing we add, so if no user is > around, > // the database is new (or not initialized correctly) > user = new User(database, database.allocateObjectId(), > ci.getUserName(), false); > user.setAdmin(true); > user.setUserPasswordHash(ci.getUserPasswordHash()); > database.setMasterUser(user); <-- Here > > public synchronized void setMasterUser(User user) { > lockMeta(systemSession); > addDatabaseObject(systemSession, user); <-- Here > > systemSession: > result = {SessionLocal} "#0 (user: DBA, INIT)" > serialId = 0 > database = {Database} "SVIFT:org.h2.engine.Database" > user = {User} "DBA:0:org.h2.engine.User" > id = 1 > networkConnectionInfo = null > locks = {ArrayList} size = 1 > autoCommit = true > random = null > lockTimeout = 2000 > nextValueFor = null > currentValueFor = null > lastIdentity = {ValueNul} "NULL" > savepoints = null > localTempTables = null > localTempTableIndexes = null > localTempTableConstraints = null > throttleMs = 0 > lastThrottleNs = 0 > currentCommand = null > allowLiterals = false > currentSchemaName = "PUBLIC" > schemaSearchPath = null > trace = null > removeLobMap = null > systemIdentifier = 0 > procedures = null > autoCommitAtTransactionEnd = false > currentTransactionName
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
I've debugged the last part of the process where hibernate tries to get a connection to the database, starting with a breakpoint in org.h2.engine.Engine.createSession(Engine.java:201) public static SessionLocal createSession(ConnectionInfo ci) { try { SessionLocal session = openSession(ci); ci = {ConnectionInfo} prop = {Properties} size = 5 <-- The properties are parsed correctly from the original url. "LOCK_TIMEOUT" -> "6" "DB_CLOSE_DELAY" -> "-1" "MODE" -> "Oracle" "DB_CLOSE_ON_EXIT" -> "FALSE" "TRACE_LEVEL_SYSTEM_OUT" -> "0" originalURL = "jdbc:h2:mem:SVIFT;MODE=Oracle;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=0;LOCK_TIMEOUT=6;DB_CLOSE_ON_EXIT=FALSE" url = "jdbc:h2:mem:SVIFT" user = "PUBLIC" name = "mem:SVIFT" This runs to L222: session = openSession(ci, ifExists, forbidCreation, cipher); ifExists (slot_1) = 0 forbidCreation (slot_2) = 0 ignoreUnknownSetting (slot_3) = 0 cipher (slot_4) = null Then to L107: if (!found) { // users is the last thing we add, so if no user is around, // the database is new (or not initialized correctly) user = new User(database, database.allocateObjectId(), ci.getUserName(), false); user.setAdmin(true); user.setUserPasswordHash(ci.getUserPasswordHash()); database.setMasterUser(user); <-- Here public synchronized void setMasterUser(User user) { lockMeta(systemSession); addDatabaseObject(systemSession, user); <-- Here systemSession: result = {SessionLocal} "#0 (user: DBA, INIT)" serialId = 0 database = {Database} "SVIFT:org.h2.engine.Database" user = {User} "DBA:0:org.h2.engine.User" id = 1 networkConnectionInfo = null locks = {ArrayList} size = 1 autoCommit = true random = null lockTimeout = 2000 nextValueFor = null currentValueFor = null lastIdentity = {ValueNul} "NULL" savepoints = null localTempTables = null localTempTableIndexes = null localTempTableConstraints = null throttleMs = 0 lastThrottleNs = 0 currentCommand = null allowLiterals = false currentSchemaName = "PUBLIC" schemaSearchPath = null trace = null removeLobMap = null systemIdentifier = 0 procedures = null autoCommitAtTransactionEnd = false currentTransactionName = null cancelAtNs = 0 sessionStart = {ValueTimestampTimeZone} "TIMESTAMP WITH TIME ZONE '2023-10-25 12:48:23.230424874+02'" commandStartOrEnd = {Instant} "2023-10-25T10:48:23.230424874Z" currentTimestamp = null variables = null queryTimeout = 0 commitOrRollbackDisabled = false waitForLock = null waitForLockThread = null modificationId = 0 objectId = 0 queryCacheSize = 8 queryCache = null modificationMetaID = -1 createViewLevel = 0 viewIndexCache = null derivedTableIndexCache = null lazyQueryExecution = false nonKeywords = null timeZone = {TimeZoneProvider$WithTimeZone} "TimeZoneProvider Europe/Oslo" tablesToAnalyze = null temporaryResultLobs = null temporaryLobs = null transaction = null state = {AtomicReference} "INIT" startStatement = -1 isolationLevel = {IsolationLevel} "READ_COMMITTED" snapshotDataModificationId = 0 idsToRelease = null truncateLargeLength = false variableBinary = false oldInformationSchema = false quirksMode = false lock = {ReentrantLock} "java.util.concurrent.locks.ReentrantLock[Unlocked]" sessionState = null sessionStateChanged = true sessionStateUpdating = false staticSettings = null user = {User} "PUBLIC:2:org.h2.engine.User" systemUser = false salt = {byte[8] passwordHash = {byte[32]} admin = true grantedRoles = null grantedRights = null database = {Database} "SVIFT:org.h2.engine.Database" trace = {Trace} comment = null id = 2 objectName = "PUBLIC" modificationId = 1 temporary = false Then to public synchronized void addDatabaseObject(SessionLocal session, DbObject obj) { <-- obj is the User above int id = obj.getId(); if (id > 0 && !starting) { checkWritingAllowed(); <-- OK } ConcurrentHashMap map = getMap(obj.getType()); <-- getMap(type = 2 which is USER) returns the content of Database.usersAndRoles if (obj.getType() == DbObject.USER) { User user = (User) obj; if (user.isAdmin() && systemUser.getName().equals(SYSTEM_USER_NAME)) { systemUser.rename(user.getName()); } } String name = obj.getName(); <-- returns PUBLIC if (SysProperties.CHECK && map.get(name) != null) { throw DbException.getInternalError("object already exists"); <-- Enters this, both names are "PUBLIC". } map (slot_4) = {ConcurrentHashMap} size = 1 "PUBLIC" -> {Role} "PUBLIC:0:org.h2.engine.Role" key = "PUBLIC" value = {Role} "PUBLIC:0:org.h2.engine.Role" system = true grantedRoles = null grantedRights = null database = {Database} "SVIFT:org.h2.engine.Database" trace = {Trace} comment
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
The same Exception occurs when I run a single test manually in intelliJ, so I doubt that it's a race condition between two tests. By setting a breakpoint where the previous stacktrace has the last statement: Caused by: java.lang.RuntimeException: object already exists at org.h2.message.DbException.getInternalError(DbException.java:355) I find an OutOfMEmoryError: serialVersionUID = 1 HIDE_SQL = "--hide--" MESSAGES = {Properties@5409} size = 202 SQL_OOME = {SQLException@5410} "java.sql.SQLException: OutOfMemoryError" SQLState = "HY000" vendorCode = 90108 next = null backtrace = {Object[6]@7812} detailMessage = "OutOfMemoryError" cause = {OutOfMemoryError@7813} "java.lang.OutOfMemoryError" stackTrace = {StackTraceElement[63]@7815} 0 = {StackTraceElement@7817} "org.h2.message.DbException.(DbException.java:62)" 1 = {StackTraceElement@7818} "org.h2.message.TraceObject.(TraceObject.java:108)" 2 = {StackTraceElement@7819} "java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)" 3 = {StackTraceElement@7820} "java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)" 4 = {StackTraceElement@7821} "java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)" 5 = {StackTraceElement@7822} "java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)" 6 = {StackTraceElement@7823} "java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)" 7 = {StackTraceElement@7824} "org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211)" 8 = {StackTraceElement@7825} "org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)" 9 = {StackTraceElement@7826} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1326)" 10 = {StackTraceElement@7827} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1232)" 11 = {StackTraceElement@7828} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)" 12 = {StackTraceElement@7829} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)" 13 = {StackTraceElement@7830} "org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)" 14 = {StackTraceElement@7831} "org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)" 15 = {StackTraceElement@7832} "org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)" 16 = {StackTraceElement@7833} "org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)" 17 = {StackTraceElement@7834} "org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)" 18 = {StackTraceElement@7835} "org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113)" 19 = {StackTraceElement@7836} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1707)" 20 = {StackTraceElement@7837} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1452)" 21 = {StackTraceElement@7838} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)" 22 = {StackTraceElement@7839} "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)" 23 = {StackTraceElement@7840} "org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)" 24 = {StackTraceElement@7841} "org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)" 25 = {StackTraceElement@7842} "org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)" 26 = {StackTraceElement@7843} "org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)" 27 = {StackTraceElement@7844} "org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)" 28 = {StackTraceElement@7845} "org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)" 29 =
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
My best guess right now is that you are using named in-memory databases, which means that the unit tests are sharing an in-memory database, and you are hitting a race condition (TOCTOU) in that chunk of code. Short of fixing the H2 code, the only thing I can suggest is using different databases for different unit tests. -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to h2-database+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/h2-database/546a5395-d8fe-45ae-a657-0f7418887ea8%40gmail.com.
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
In addition, the h2 database is initialized by running scripts that fits the chosen profile of the project. <-- it's set to ignore failures from dropping the tables, maybe this no longer works as before? On Wed, Oct 25, 2023 at 8:59 AM Knut Skomedal wrote: > > Here's the full stacktrace: > java.lang.IllegalStateException: Failed to load ApplicationContext > at > org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98) > at > org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) > at > org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) > at > org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) > at > org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) > at > org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) > at > org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) > at > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > at > org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) > at > org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) > at > org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) > at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) > at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) > at > org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) > at > org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) > at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) > at org.junit.runners.ParentRunner.run(ParentRunner.java:413) > at > org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) > at > org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365) > at > org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273) > at > org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238) > at > org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159) > at > org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:383) > at > org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:344) > at > org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125) > at > org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:417) > Caused by: org.springframework.beans.factory.BeanCreationException: > Error creating bean with name 'entityManagerFactory' defined in class > path resource [h2/h2-tilkobling.xml]: Invocation of init method > failed; nested exception is javax.persistence.PersistenceException: > [PersistenceUnit: default] Unable to build Hibernate SessionFactory; > nested exception is org.hibernate.exception.GenericJDBCException: > Unable to open JDBC Connection for DDL execution > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) > at > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) > at > org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) > at > org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) > at > org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) > at >
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
Here's the full stacktrace: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:365) at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:273) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:159) at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:383) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:344) at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:125) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:417) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [h2/h2-tilkobling.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at
Re: [h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
On 10/24/2023 5:01 PM, Knut Skomedal wrote: Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.RuntimeException: object already exists" [5-224] Can you post the actual stacktrace of this part ? -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to h2-database+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/h2-database/788a2c36-8bec-4daa-bab9-d9d402090cea%40gmail.com.
[h2] Java junit tests fails with "object already exists" after upgrade from h2 1.4.199 to 2.2.224
Does anyone know how to configure h2 version 2.2.224 to drop in-memory tables between unit tests, or accept that they already exist? The code in question runs a number of junit tests using an in-memory h2 database. All of them fails to create the spring applicationcontext when I upgrade the h2-version past 1.4.199: o.s.test.context.TestContextManager: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener] to prepare test instance [my testclass] java.lang.IllegalStateException: Failed to load ApplicationContext LocalContainerEntityManagerFactoryBean: Failed to initialize JPA EntityManagerFactory Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "java.lang.RuntimeException: object already exists" [5-224] I'm guessing that the problem lies in a failure to drop the tables created by the previous test class. I've tried all the tips I found at this link (https://blog.kie.org/2023/08/tip-h2-upgrade.html) and read through the available options for the constructor of the h2server, but I haven't found anything that allows the applicationContext to be created. The tests are using "org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" as the jpaVendorAdapter of org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean. This bean has properties: org.hibernate.dialect.H2Dialect ${hibernate.show_sql} true true true 100 false true create script <-- tested based on the linked article ${project.basedir}/src/test/resources/drop-tables.sql <-- tested based on the linked article The drop-tables.sql script contains DROP ALL OBJECTS The h2server is defined with: I've attempted to add the -ifNotExists option, with no effect. The datasource: I've tested MODE=LEGACY with no effect -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to h2-database+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/h2-database/03e2b050-e039-4714-85aa-ab94496b5c0fn%40googlegroups.com.