我试图在我的Cassandra数据库中永久保存一个java.time.LocalDateTime对象,并保持它的时区无关性。我使用Spring Data Cassandra来实现这一点。
问题是,在某个地方,有些东西正在处理这些LocalDateTime对象,好像它们处于我的服务器的时区,并在将它们存储到数据库中时将它们偏移到UTC时间。
这是一个bug还是一个功能?我能以某种方式解决它吗?
配置:
以下是用于填充BookingRecord中starttime的字符串:
问题是,在某个地方,有些东西正在处理这些LocalDateTime对象,好像它们处于我的服务器的时区,并在将它们存储到数据库中时将它们偏移到UTC时间。
这是一个bug还是一个功能?我能以某种方式解决它吗?
配置:
@Configuration
@EnableCassandraRepositories(
basePackages = "my.base.package")
public class CassandraConfig extends AbstractCassandraConfiguration{
@Override
protected String getKeyspaceName() {
return "keyspacename";
}
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster =
new CassandraClusterFactoryBean();
cluster.setContactPoints("127.0.0.1");
cluster.setPort(9142);
return cluster;
}
@Bean
public CassandraMappingContext cassandraMapping()
throws ClassNotFoundException {
return new BasicCassandraMappingContext();
}
}
我希望保留的预订记录:
@Table("booking")
public class BookingRecord {
@PrimaryKeyColumn(
ordinal = 0,
type = PrimaryKeyType.PARTITIONED
)
private UUID bookingId = null;
@PrimaryKeyColumn(
ordinal = 1,
type = PrimaryKeyType.CLUSTERED,
ordering = Ordering.ASCENDING
)
private LocalDateTime startTime = null;
...
}
简单仓库接口:
@Repository
public interface BookingRepository extends CassandraRepository<BookingRecord> { }
保存通话:
...
@Autowired
BookingRepository bookingRepository;
...
public void saveBookingRecord(BookingRecord bookingRecord) {
bookingRepository.save(bookingRecord);
}
以下是用于填充BookingRecord中starttime的字符串:
"startTime": "2017-06-10T10:00:00Z"
在时间戳已持久化后,这是来自cqlsh的输出:
cqlsh:keyspacename> select * from booking ;
bookingid | starttime
--------------------------------------+--------------------------------
8b640c30-4c94-11e7-898b-6dab708ec5b4 | 2017-06-10 15:00:00.000000+0000