2015-01-25 2 views
0

Мы используем cassandra для некоторых наших данных. Существует один column family (таблица), который имеет один столбец типа blob.Как использовать ByteBuffer в сеансовом классе, удаленном?

Согласно datastax documentation, тип данных для cql blob равен java.nio.ByteBuffer.

У нас есть класс для отображения объекта Кассандря таблицы, скажем SampleEntity, и это определенно ниже

 @Table(name="sampletable", keyspace="main") 
     public class SampleEntity{ 
      @Column("id") 
      private UUID id; 

      @Column("data") 
      private ByteBuffer complexData; 

      //...getters and setters 
     } 

Мы без гражданства класса сессионного компонента (удаленный EJB), который имеет код упорствовать объекты в базу данных используя диспетчер объектов. Этот класс реализует интерфейс, аннотированный с помощью @Remote (javax.ejb.Remote).

 @stateless 
    public class SampleEntityBean implements SampleEntityBeanRemote{ 

     //inject entity manager 
     .... SomeDatatype entityManager 

     UUID createEntity(SampleEntity entity){ 
       entityManager.persist(entity); 
     } 

    } 

Теперь мы используем SampleEntityBean во многих местах в нашем приложении, вводя его с помощью @EJB аннотацию. Таким образом, это означает, что этот метод называется удаленно с использованием RMI underhood.

Проблема: ByteBuffer не является сериализуемым и дает Unable to marshal ejb parameters, вызванный Not serializable exception: java.nio.HeapByteBuffer.

Это означает, что с одной стороны мне требуется ByteBuffer для blob, а с другой стороны, я не могу использовать это, поскольку он не является сериализуемым.

Итак, есть ли способ обойти это стандартным способом?

Есть ли способ использовать какой-либо другой тип данных (например, byte[]) и, возможно, использовать аннотацию на нем для преобразования в ByteBuffer в последнюю минуту?

+0

Кто-то пожалуйста, помогите – pinkpanther

ответ

1

Не знаю, насколько я знаю. API сопоставления использует тип поля, а не геттеры/сеттеры, поэтому вы не можете хранить его в виде байта [], но получатель GetteBuffer возвращает его. Похоже, вам нужно использовать два разных DTO, один для драйвера Cassandra, один для ваших EJB.

Взглянув на JIRA для водителя кого-то уже запрошенной пользовательской сериализации: https://datastax-oss.atlassian.net/browse/JAVA-566 так идти и голосовать за что :)

+1

Спасибо за ответ. Я собираюсь с двумя полевыми подходами. Один для отображения столбцов и один для остальных. Я держал его как преходящий, а другой как @Transient. Мы должны обрабатывать преобразование либо в сеттерах и геттерах, либо реализовать методы writeObject и readObject в классе сущностей. Я отправлю это как ответ будущим посетителям. – pinkpanther

Смежные вопросы