Hello,
I am using DataStax Java Driver and can not execute "save" command with the object mapper.
I have next table:
CREATE TABLE media_upload.audio_info (
swift_id blob,
size bigint,
audio_id blob,
last_succeed_segment bigint,
PRIMARY KEY (swift_id)
);
Here is my table in Java:
package com.loader.entity.tmp;
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import com.datastax.driver.mapping.annotations.Transient;
import javax.xml.bind.DatatypeConverter;
import java.nio.ByteBuffer;
@Table(keyspace = "media_upload", name = "audio_info",
readConsistency = "QUORUM",
writeConsistency = "QUORUM",
caseSensitiveKeyspace = false,
caseSensitiveTable = false)
public class AudioInfo{
private ByteBuffer swiftId;
private Long size;
private ByteBuffer audioId;
private Long lastSucceedSegment;
@PartitionKey
@Column(name = "swift_id")
public ByteBuffer getSwiftId() {
return swiftId;
}
@Column(name = "size")
public Long getSize() {
return size;
}
@Column(name = "audio_id")
public ByteBuffer getAudioId() {
return audioId;
}
@Column(name = "last_succeed_segment")
public Long getLastSucceedSegment() {
return lastSucceedSegment;
}
public void setSwiftId(ByteBuffer swiftId){
this.swiftId=swiftId;
}
@Transient
public String getHexSwiftId() {
return DatatypeConverter.printHexBinary(swiftId.array());
}
@Transient
public void setSize(Long size){
this.size=size;
}
@Transient
public String getHexAudioId() {
return DatatypeConverter.printHexBinary(audioId.array());
}
@Transient
public void setAudioId(ByteBuffer audioId){
this.audioId=audioId;
}
@Transient
public void setLastSucceedSegment(Long lastSucceedSegment){
this.lastSucceedSegment=lastSucceedSegment;
}
@Transient
@Override
public String toString() {
return "{swift_id='"+getHexSwiftId()+
"',size='"+getSize()+
"',audio_id='"+getHexAudioId()+
"',last_succeed_segment='"+lastSucceedSegment+"'}";
}
}
Here is what I am doing to save AudioInfo:
AudioInfo audioInfo = new AudioInfo();
audioInfo.setSwiftId(ByteBuffer.allocate(Long.BYTES).putLong(123));
audioInfo.setAudioId(ByteBuffer.allocate(Long.BYTES).putLong(124));
audioInfo.setLastSucceedSegment(0L);
audioInfo.setSize(100L);
mapper.save(audioInfo);
After "mapper.save(audioInfo);" I am getting an error:
com.datastax.driver.core.exceptions.InvalidQueryException: Key may not be empty
at com.datastax.driver.core.Responses$Error.asException(Responses.java:136)
at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179)
at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:174)
at com.datastax.driver.core.RequestHandler.access$2600(RequestHandler.java:43)
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:793)
at com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:627)
at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:1012)
at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:935)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:342)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:328)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:321)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:342)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:328)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:321)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:342)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:328)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:321)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:342)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:328)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:321)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1280)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:342)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:328)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:890)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:564)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:505)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:419)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:391)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
at java.lang.Thread.run(Thread.java:745)
The strange thing happens when I am using next code:
AudioInfo audioInfo = new AudioInfo();
audioInfo.setSwiftId(ByteBuffer.allocate(Long.SIZE).putLong(123));
audioInfo.setAudioId(ByteBuffer.allocate(Long.SIZE).putLong(124));
audioInfo.setLastSucceedSegment(0L);
audioInfo.setSize(100L);
mapper.save(audioInfo);
It adds without error but in the database I see that both swift_id and audio_id have next value:
0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
What am I doing wrongly?
Sincerely,
Alexandr