Hello Alexandr,

I replied on the Java driver mailing list. TL;DR: you forgot to flip your
buffers.

Thanks,

Alexandre

On Mon, Sep 12, 2016 at 3:59 PM Alexandr Porunov <alexandr.poru...@gmail.com>
wrote:

>
> *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*
>
-- 
Alexandre Dutra
Driver & Tools Engineer @ DataStax

Reply via email to