Ada banyak tes di HR suite menggunakan data induk/anak. Misalnya: EagerTest
.
Dengan MS SQL, tes ini gagal dengan:
javax.persistence.PersistenceException: org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
Saya menduga ini karena definisi kolom:
[Hibernate] create table Node (id int not null, string varchar(255), version int, parent_id int, primary key (id))
Mungkin itu harus dinyatakan secara eksplisit sebagai NULL
Mungkin itu harus dinyatakan secara eksplisit sebagai
NULL
Saya tidak berpikir begitu. Saya pikir pasti ada hal lain yang terjadi.
(Mungkin definisi tabel tidak dijatuhkan dengan benar di antara tes?)
Jika saya hanya menjalankan org.hibernate.reactive.EagerTest#testEagerCollectionFetch
pada DB baru, saya mendapatkan:
INFO Version [vert.x-eventloop-thread-0] HHH000412: Hibernate ORM core version 5.4.29.Final
Using database type: MSSQLSERVER
INFO Version [vert.x-worker-thread-0] HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
INFO Dialect [vert.x-worker-thread-0] HHH000400: Using dialect: org.hibernate.dialect.SQLServer2012Dialect
INFO ReactiveIntegrator [vert.x-worker-thread-0] HRX000001: Hibernate Reactive Preview
INFO DefaultSqlClientPool [vert.x-worker-thread-0] HRX000011: SQL Client URL [jdbc:sqlserver://localhost:1433;user=SA;password=HReact@~~]
INFO DefaultSqlClientPool [vert.x-worker-thread-0] HRX000012: Connection pool size: 5
INFO DefaultSqlClientPool [vert.x-eventloop-thread-0] HRX000013: Detected driver [io.vertx.pgclient.spi.PgDriver]
INFO DefaultSqlClientPool [vert.x-eventloop-thread-0] HRX000013: Detected driver [io.vertx.mysqlclient.spi.MySQLDriver]
INFO DefaultSqlClientPool [vert.x-eventloop-thread-0] HRX000013: Detected driver [io.vertx.db2client.spi.DB2Driver]
INFO DefaultSqlClientPool [vert.x-eventloop-thread-0] HRX000013: Detected driver [io.vertx.mssqlclient.spi.MSSQLDriver]
[Hibernate] alter table Element drop constraint FKcwlxr32pujpq4d7va12w278fw
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Statement(s) could not be prepared.]
[Hibernate] alter table Node drop constraint FKnuolrnqa3oux6ln0vkqeuhsda
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Statement(s) could not be prepared.]
[Hibernate] drop table Element
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Cannot drop the table 'Element', because it does not exist or you do not have permission.]
[Hibernate] drop table Node
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Cannot drop the table 'Node', because it does not exist or you do not have permission.]
[Hibernate] drop sequence hibernate_sequence
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Cannot drop the sequence 'hibernate_sequence', because it does not exist or you do not have permission.]
[Hibernate] alter table Element drop constraint FKcwlxr32pujpq4d7va12w278fw
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Statement(s) could not be prepared.]
[Hibernate] alter table Node drop constraint FKnuolrnqa3oux6ln0vkqeuhsda
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Statement(s) could not be prepared.]
[Hibernate] drop table Element
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Cannot drop the table 'Element', because it does not exist or you do not have permission.]
[Hibernate] drop table Node
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Cannot drop the table 'Node', because it does not exist or you do not have permission.]
[Hibernate] drop sequence hibernate_sequence
WARN GenerationTargetToDatabase [vert.x-eventloop-thread-0] HRX000021: DDL command failed [io.vertx.mssqlclient.MSSQLException: Cannot drop the sequence 'hibernate_sequence', because it does not exist or you do not have permission.]
[Hibernate] create sequence hibernate_sequence start with 1 increment by 1
[Hibernate] create table Element (id int not null, node_id int, primary key (id))
[Hibernate] create table Node (id int not null, string varchar(255), version int, parent_id int, primary key (id))
[Hibernate] alter table Element add constraint FKcwlxr32pujpq4d7va12w278fw foreign key (node_id) references Node
[Hibernate] alter table Node add constraint FKnuolrnqa3oux6ln0vkqeuhsda foreign key (parent_id) references Node
[Hibernate] select next value for hibernate_sequence
[Hibernate] select next value for hibernate_sequence
[Hibernate] select next value for hibernate_sequence
[Hibernate] select next value for hibernate_sequence
[Hibernate] select next value for hibernate_sequence
[Hibernate] insert into Node (parent_id, string, version, id) values (<strong i="7">@P1</strong>, <strong i="8">@P2</strong>, <strong i="9">@P3</strong>, @P4)
javax.persistence.PersistenceException: org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
java.util.concurrent.CompletionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:838)
at java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:811)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:121)
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774)
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:121)
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774)
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at org.hibernate.reactive.pool.impl.Handlers.lambda$toCompletionStage$0(Handlers.java:29)
at io.vertx.core.impl.future.FutureImpl$3.onFailure(FutureImpl.java:128)
at io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:79)
at io.vertx.core.impl.future.FutureImpl.tryFail(FutureImpl.java:198)
at io.vertx.core.impl.future.PromiseImpl.tryFail(PromiseImpl.java:23)
at io.vertx.sqlclient.impl.QueryResultBuilder.tryFail(QueryResultBuilder.java:118)
at io.vertx.core.Promise.fail(Promise.java:89)
at io.vertx.core.Promise.handle(Promise.java:53)
at io.vertx.core.Promise.handle(Promise.java:29)
at io.vertx.core.impl.future.FutureImpl$3.onFailure(FutureImpl.java:128)
at io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:79)
at io.vertx.core.impl.future.FutureImpl.tryFail(FutureImpl.java:198)
at io.vertx.core.impl.future.PromiseImpl.tryFail(PromiseImpl.java:23)
at io.vertx.core.impl.future.PromiseImpl.onFailure(PromiseImpl.java:54)
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:43)
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:23)
at io.vertx.sqlclient.impl.command.CommandResponse.fire(CommandResponse.java:46)
at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:261)
at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:97)
at io.vertx.core.net.impl.NetSocketImpl.lambda$new$1(NetSocketImpl.java:97)
at io.vertx.core.streams.impl.InboundBuffer.handleEvent(InboundBuffer.java:240)
at io.vertx.core.streams.impl.InboundBuffer.write(InboundBuffer.java:130)
at io.vertx.core.net.impl.NetSocketImpl.lambda$handleMessage$9(NetSocketImpl.java:390)
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:49)
at io.vertx.core.impl.ContextImpl.emit(ContextImpl.java:275)
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:22)
at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:389)
at io.vertx.core.net.impl.ConnectionBase.read(ConnectionBase.java:153)
at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:154)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.vertx.mssqlclient.impl.codec.TdsMessageEncoder.lambda$write$0(TdsMessageEncoder.java:52)
at io.vertx.mssqlclient.impl.codec.MSSQLCommandCodec.complete(MSSQLCommandCodec.java:70)
at io.vertx.mssqlclient.impl.codec.ExtendedQueryCommandCodec.decodeMessage(ExtendedQueryCommandCodec.java:121)
at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.decodeMessage(TdsMessageDecoder.java:70)
at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.decode(TdsMessageDecoder.java:49)
at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.decode(TdsMessageDecoder.java:27)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31)
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$doFlush$34(ReactiveSessionImpl.java:879)
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:836)
... 73 more
Caused by: org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
... 76 more
Caused by: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
at io.vertx.mssqlclient.impl.codec.MSSQLCommandCodec.handleErrorToken(MSSQLCommandCodec.java:60)
at io.vertx.mssqlclient.impl.codec.ExtendedQueryCommandCodec.decodeMessage(ExtendedQueryCommandCodec.java:84)
... 25 more
Gradle Test Executor 34 > org.hibernate.reactive.EagerTest > testEagerCollectionFetch FAILED
java.util.concurrent.CompletionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:838)
at java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:811)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:121)
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774)
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.lambda$unroll$0(AsyncTrampoline.java:121)
at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:774)
at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:750)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1990)
at org.hibernate.reactive.pool.impl.Handlers.lambda$toCompletionStage$0(Handlers.java:29)
at io.vertx.core.impl.future.FutureImpl$3.onFailure(FutureImpl.java:128)
at io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:79)
at io.vertx.core.impl.future.FutureImpl.tryFail(FutureImpl.java:198)
at io.vertx.core.impl.future.PromiseImpl.tryFail(PromiseImpl.java:23)
at io.vertx.sqlclient.impl.QueryResultBuilder.tryFail(QueryResultBuilder.java:118)
at io.vertx.core.Promise.fail(Promise.java:89)
at io.vertx.core.Promise.handle(Promise.java:53)
at io.vertx.core.Promise.handle(Promise.java:29)
at io.vertx.core.impl.future.FutureImpl$3.onFailure(FutureImpl.java:128)
at io.vertx.core.impl.future.FutureBase.emitFailure(FutureBase.java:79)
at io.vertx.core.impl.future.FutureImpl.tryFail(FutureImpl.java:198)
at io.vertx.core.impl.future.PromiseImpl.tryFail(PromiseImpl.java:23)
at io.vertx.core.impl.future.PromiseImpl.onFailure(PromiseImpl.java:54)
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:43)
at io.vertx.core.impl.future.PromiseImpl.handle(PromiseImpl.java:23)
at io.vertx.sqlclient.impl.command.CommandResponse.fire(CommandResponse.java:46)
at io.vertx.sqlclient.impl.SocketConnectionBase.handleMessage(SocketConnectionBase.java:261)
at io.vertx.sqlclient.impl.SocketConnectionBase.lambda$init$0(SocketConnectionBase.java:97)
at io.vertx.core.net.impl.NetSocketImpl.lambda$new$1(NetSocketImpl.java:97)
at io.vertx.core.streams.impl.InboundBuffer.handleEvent(InboundBuffer.java:240)
at io.vertx.core.streams.impl.InboundBuffer.write(InboundBuffer.java:130)
at io.vertx.core.net.impl.NetSocketImpl.lambda$handleMessage$9(NetSocketImpl.java:390)
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:49)
at io.vertx.core.impl.ContextImpl.emit(ContextImpl.java:275)
at io.vertx.core.impl.EventLoopContext.emit(EventLoopContext.java:22)
at io.vertx.core.net.impl.NetSocketImpl.handleMessage(NetSocketImpl.java:389)
at io.vertx.core.net.impl.ConnectionBase.read(ConnectionBase.java:153)
at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:154)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.vertx.mssqlclient.impl.codec.TdsMessageEncoder.lambda$write$0(TdsMessageEncoder.java:52)
at io.vertx.mssqlclient.impl.codec.MSSQLCommandCodec.complete(MSSQLCommandCodec.java:70)
at io.vertx.mssqlclient.impl.codec.ExtendedQueryCommandCodec.decodeMessage(ExtendedQueryCommandCodec.java:121)
at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.decodeMessage(TdsMessageDecoder.java:70)
at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.decode(TdsMessageDecoder.java:49)
at io.vertx.mssqlclient.impl.codec.TdsMessageDecoder.decode(TdsMessageDecoder.java:27)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Caused by:
javax.persistence.PersistenceException: org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31)
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.lambda$doFlush$34(ReactiveSessionImpl.java:879)
at java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:836)
... 73 more
Caused by:
org.hibernate.HibernateException: io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
at org.hibernate.reactive.session.impl.ReactiveExceptionConverter.convert(ReactiveExceptionConverter.java:31)
... 75 more
Caused by:
io.vertx.mssqlclient.MSSQLException: Cannot insert the value NULL into column 'parent_id', table 'master.dbo.Node'; column does not allow nulls. INSERT fails.
at io.vertx.mssqlclient.impl.codec.MSSQLCommandCodec.handleErrorToken(MSSQLCommandCodec.java:60)
at io.vertx.mssqlclient.impl.codec.ExtendedQueryCommandCodec.decodeMessage(ExtendedQueryCommandCodec.java:84)
... 25 more
----------------------------------------------------------------
mssql results: FAILURE (1 tests, 0 passed, 1 failed, 0 skipped)
----------------------------------------------------------------
Peringatan pertama yang diharapkan menurut saya, mengingat DB kosong. Kemudian pengaturan pengujian terlihat OK:
[Hibernate] create sequence hibernate_sequence start with 1 increment by 1
[Hibernate] create table Element (id int not null, node_id int, primary key (id))
[Hibernate] create table Node (id int not null, string varchar(255), version int, parent_id int, primary key (id))
[Hibernate] alter table Element add constraint FKcwlxr32pujpq4d7va12w278fw foreign key (node_id) references Node
[Hibernate] alter table Node add constraint FKnuolrnqa3oux6ln0vkqeuhsda foreign key (parent_id) references Node
MSSQLException: Cannot drop the table 'Node', because it does not exist or you do not have permission.]
Ini pasti alasan sebenarnya.
Ini pasti alasan sebenarnya.
Oh, maaf, salahku, tidak, bukan itu alasannya.
Aku benar-benar tidak tahu. Saya yakin bukan kunci asing SQL Server adalah not null
secara default, jadi pasti ada hal lain yang terjadi.
Sudahkah Anda mencoba menjalankan SQL yang sama dari klien GUI untuk memeriksa apakah yang saya katakan itu benar?
Tidak. Saya akan mencobanya
>
Ini berfungsi ketika saya menjalankan ini dari sqlcmd
:
1> create sequence hibernate_sequence start with 1 increment by 1
2> go
1> create table Element (id int not null, node_id int, primary key (id))
2> go
1> create table Node (id int not null, string varchar(255), version int, parent_id int, primary key (id))
2> go
1> alter table Element add constraint FKcwlxr32pujpq4d7va12w278fw foreign key (node_id) references Node
2> go
1> alter table Node add constraint FKnuolrnqa3oux6ln0vkqeuhsda foreign key (parent_id) references Node
2> go
1> insert into Node (parent_id, string, version, id) values (null, 'parent',0, 1)
2> go
(1 rows affected)
1> select * from Node
2> go
id string version parent_id
----------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- -----------
1 parent 0 NULL
(1 rows affected)
1> exit
Jadi Anda benar, ini tidak terkait dengan definisi kendala.
@tsegismont , ketika EagerTest
dengan breakpoint pada MSSQLException
konstruktor, saya melihat MSSQLException
dengan pesan "Sintaks salah di dekat '?'." semakin diciptakan.
Pengecualian itu tampaknya dimakan, dan sebagai gantinya MSSQLException
dengan pesan "Pernyataan tidak dapat disiapkan" akan dilemparkan.
Saya juga melihat masalah yang sama ketika men-debug beberapa tes lain juga menggunakan Vert.x 4.1.0-SNAPSHOT.
@gbadner Anda memerlukan perubahan yang saya bagikan di https://github.com/DavideD/hibernate-reactive/pull/13 (khususnya, implementasi kelas Parameters
untuk SQL Server)
Saya akan membuat cabang hulu untuk melacak kemajuan dengan sql server, sehingga saya dapat rebase ke utama terbaru dan kami dapat memiliki cabang referensi dengan semua perubahan.
@tsegismont apa status ini?
(Apa pun masalahnya, saya rasa deskripsi masalah tidak menangkapnya.)
@gavinking Saya belum bisa menyelidikinya
@gavinking Saya telah menemukan bahwa mengubah implementasi dialek menyelesaikan masalah:
Index: hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcEnvironmentInitiator.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcEnvironmentInitiator.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcEnvironmentInitiator.java
--- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcEnvironmentInitiator.java (revision dd82c137dcdc3cf5a388ae427e1ec042a9d9552c)
+++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcEnvironmentInitiator.java (date 1621943075708)
@@ -135,10 +135,18 @@
return CockroachDB201Dialect.class;
}
else if ( url.startsWith("sqlserver:") ) {
- return SQLServer2012Dialect.class;
+ return SpecialSQLServer2012Dialect.class;
}
else {
return null;
}
}
+
+ public static class SpecialSQLServer2012Dialect extends SQLServer2012Dialect {
+
+ <strong i="7">@Override</strong>
+ public String getNullColumnString() {
+ return " null";
+ }
+ }
}
Saya tidak tahu mengapa tetapi tampaknya server membuat kolom yang tidak dapat dibatalkan jika tidak secara eksplisit ditentukan sebagai dapat dibatalkan (seperti Sybase).
Apakah itu membunyikan bel?
Maksud saya, dialek itu adalah yang digunakan dalam Hibernate ORM selama bertahun-tahun, jadi sulit untuk melihat bagaimana itu bisa salah (kecuali driver SQL server JDBC melakukan sesuatu yang aneh).
Inilah sesuatu yang saya temukan https://social.msdn.microsoft.com/Forums/sqlserver/en-US/16c39868-96b1-457c-a3a5-f291ba75d635/whether-a-column-is-nullable-by-default
Tampaknya ada beberapa pengaturan yang dapat memengaruhi perilaku ini. Tapi mereka seharusnya melakukan hal yang benar secara default.
Sebagian besar koneksi modern secara otomatis melakukan
SET ANSI_NULL_DEFAULT_ON
saat koneksi dibuat
Mungkin Anda harus mencoba melakukan itu.
@gavinking izinkan saya memeriksa apakah ini karena konfigurasi server atau sesuatu yang dilakukan driver JDBC yang tidak dilakukan oleh Klien Reaktif.
Dalam hal ini saya akan membuat masalah di hulu dan kita bisa menutup yang ini.
@gavinking ini tidak berpengaruh.
Saya mengajukan https://github.com/Eclipse-vertx/vertx-sql-client/issues/963 untuk melacak masalah di hulu.
Jangan ragu untuk menutup yang ini. Jika tidak, kami dapat menutupnya nanti saat masalah upstream telah teratasi.
Ok terima kasih. Saya tidak berpikir masalahnya ada di sini, jadi saya menutup yang ini.