@Override
 @SuppressWarnings("unchecked")
 public Conversation create(Conversation conv) {
   final Long id = getId(conv);
   if (template
           .opsForValue()
           .get(
               KeyUtils.conversationProductIdAndVisitorToken(
                   conv.getTopic().getProductId(), conv.getVisitor()))
       != null) {
     return findBy(id);
   }
   conv.setId(id);
   template.opsForHash().put(getIdKey(id), "id", id.toString());
   template.opsForHash().put(getIdKey(id), "topic", conv.getTopic().getId().toString());
   template.opsForHash().put(getIdKey(id), "visitor", conv.getVisitor());
   template.opsForHash().put(getIdKey(id), "visitorName", conv.getVisitorName());
   template
       .opsForHash()
       .put(getIdKey(id), "customerServiceUser", conv.getCustomerServiceUsername());
   template.opsForHash().put(getIdKey(id), "status", conv.getStatus().toString());
   template
       .opsForHash()
       .put(getIdKey(id), "createDate", String.valueOf(conv.getCreateDate().getTime()));
   template
       .opsForValue()
       .set(
           KeyUtils.conversationProductIdAndVisitorToken(
               conv.getTopic().getProductId(), conv.getVisitor()),
           id.toString());
   return conv;
 }
 protected Long getId(Conversation conv) {
   String id =
       template
           .opsForValue()
           .get(
               KeyUtils.conversationProductIdAndVisitorToken(
                   conv.getTopic().getProductId(), conv.getVisitor()));
   if (id != null) return Long.valueOf(id);
   if (conv.getId() == null) {
     return idCounter.incrementAndGet();
   }
   return conv.getId();
 }