• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

데이터베이스 스키마 자동생성(create)인데 시작시 테이블 drop이 잘 안됩니다

22.02.15 16:16 작성 조회수 277

0

질문 올리기 전에 하이버네이트랑 H2 데이터베이스를 모두 latest stable 버전으로 올렸더니 의외로 해결됐습니다

아마 옛날 버전에 버그가 있거나 버전 궁합이 잘 안맞아서 그랬던것 같습니다

 

혹시나 저랑 같은 문제를 겪으시는 분들을 위해 질문은 남겨봅니다!

=============

제목이랑 같은데요, persistence.xml에서 

<property name="hibernate.hbm2ddl.auto" value="create" />

을 적용하고 메인함수를 실행하면 db를 싹 비운 처음에는 잘 되는데, 두번째부터는 처음에 모든 테이블을 drop하고 실행하는데 이 drop이 제대로 작동하지 않는 것 같습니다. 

 

=== 로그===

..중략...

 

2월 15, 2022 3:57:47 오후 org.hibernate.dialect.Dialect <init>

INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect

Hibernate: 

    

    drop table Category if exists

Hibernate: 

    

    drop table category_item if exists

Hibernate: 

    

    drop table Delivery if exists

Hibernate: 

    

    drop table Item if exists

Hibernate: 

    

    drop table Member if exists

2월 15, 2022 3:57:48 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection

INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@65eb76cd] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

2월 15, 2022 3:57:48 오후 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException

WARN: GenerationTarget encountered exception accepting command : Error executing DDL "

    drop table Category if exists" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "

    drop table Category if exists" via JDBC Statement

at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlString(SchemaDropperImpl.java:375)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlStrings(SchemaDropperImpl.java:359)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:241)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:154)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:126)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:112)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:144)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)

at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)

at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)

at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)

at jpabook.JpaMain.main(JpaMain.java:10)

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "CATEGORY" because "FKPIG62MG2IH4HQIRYCP0RFUBY3" depends on it; SQL statement:

 

    drop table Category if  [90107-210]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:651)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:496)

at org.h2.message.DbException.get(DbException.java:227)

at org.h2.command.ddl.DropTable.prepareDrop(DropTable.java:97)

at org.h2.command.ddl.DropTable.update(DropTable.java:121)

at org.h2.command.CommandContainer.update(CommandContainer.java:174)

at org.h2.command.Command.executeUpdate(Command.java:252)

at org.h2.server.TcpServerThread.process(TcpServerThread.java:408)

at org.h2.server.TcpServerThread.run(TcpServerThread.java:191)

at java.base/java.lang.Thread.run(Thread.java:834)

 

at org.h2.message.DbException.getJdbcSQLException(DbException.java:651)

at org.h2.engine.SessionRemote.readException(SessionRemote.java:637)

at org.h2.engine.SessionRemote.done(SessionRemote.java:606)

at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:227)

at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)

at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)

at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)

... 15 more

 

2월 15, 2022 3:57:48 오후 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException

WARN: GenerationTarget encountered exception accepting command : Error executing DDL "

    drop table Delivery if exists" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "

    drop table Delivery if exists" via JDBC Statement

at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlString(SchemaDropperImpl.java:375)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlStrings(SchemaDropperImpl.java:359)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:241)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:154)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:126)

at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:112)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:144)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)

at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)

at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939)

at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)

at jpabook.JpaMain.main(JpaMain.java:10)

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "DELIVERY" because "FKQP0F0WCL9U3NIQYKUYM5MW22I" depends on it; SQL statement:

 

   중략...

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" already exists; SQL statement:

 

    create table Member (

       member_id bigint not null,

        createdBy varchar(255),

        createdDateTime timestamp,

        lastModifiedBy varchar(255),

        lastModifiedDateTime timestamp,

        city varchar(255),

        street varchar(255),

        zipcode varchar(255),

        name varchar(255),

 [42101-210]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:521)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:496)

at org.h2.message.DbException.get(DbException.java:227)

at org.h2.message.DbException.get(DbException.java:203)

at org.h2.command.ddl.CreateTable.update(CreateTable.java:88)

at org.h2.command.CommandContainer.update(CommandContainer.java:174)

at org.h2.command.Command.executeUpdate(Command.java:252)

at org.h2.server.TcpServerThread.process(TcpServerThread.java:408)

at org.h2.server.TcpServerThread.run(TcpServerThread.java:191)

at java.base/java.lang.Thread.run(Thread.java:834)

 

at org.h2.message.DbException.getJdbcSQLException(DbException.java:521)

at org.h2.engine.SessionRemote.readException(SessionRemote.java:637)

at org.h2.engine.SessionRemote.done(SessionRemote.java:606)

at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:227)

at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)

at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)

at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)

... 15 more

======

혹시 해결방법이 무엇인지...

 

cascade를 추가로 붙이면 삭제가 되던데 그렇게 할 수는 없을까요??

답변 1

답변을 작성해보세요.

1

codesweaver님의 프로필

codesweaver

2022.02.16

안녕하세요, 초코우유 님. 공식 서포터즈 codesweaver 입니다.

.
H2의 버전 문제일 수 있습니다.

아래의 링크를 참조하여 H2 버전을 바꿔보시기 바랍니다.

https://www.inflearn.com/questions/17219
.
감사합니다.