我们正在使用cassandra
来满足我们的一些数据需求。有一个column family
(表格),其中有一列blob
。
根据datastax
documentation,cql blob的数据类型为java.nio.ByteBuffer
。
我们有一个对象映射到cassandra表的类让我们说SampleEntity,它的定义如下
@Table(name="sampletable", keyspace="main")
public class SampleEntity{
@Column("id")
private UUID id;
@Column("data")
private ByteBuffer complexData;
//...getters and setters
}
我们有一个无状态会话bean类(远程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底层远程调用此方法。
问题是ByteBuffer不可序列化,它由Unable to marshal ejb parameters
引起Not serializable exception: java.nio.HeapByteBuffer
。
这意味着,一方面我需要ByteBuffer
blob
而另一方面我可能不会使用它,因为它不可序列化。
那么,有没有办法以标准方式解决这个问题?
有什么方法可以使用某种不同的数据类型(比如byte[]
)并且可能会在其上使用注释在最后一分钟转换为ByteBuffer
?
答案 0 :(得分:1)
据我所知,没有办法。映射API使用字段类型而不是getter / setter,因此您不能将其存储为byte [],但让getter返回ByteBuffer。看起来你需要使用两个不同的DTO,一个用于Cassandra驱动程序,一个用于EJB。
看一下其他人已经请求自定义序列化的驱动程序的JIRA:https://datastax-oss.atlassian.net/browse/JAVA-566所以去投票:)