Мы используем 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
в последнюю минуту?
Кто-то пожалуйста, помогите – pinkpanther