[英]hibernate ogm mongodb Timestamp
我有以下mongodb
{
"_id" : ObjectId("57713c6304f4dc08008b45ba"),
"SYS_FluxName" : "ERDF_F12_17X100A100F0073T_GRD-F046_0321_00011_FL_00001_00001.xml",
"SYS_ReadDateTime" : Timestamp(6300883749567463, 83),
"SYS_BaseNameZip" : "ERDF_F12_17X100A100F0073T_GRD-F046_0321_00011_M_30_20160301223530.zip",
"SYS_Status" : NumberLong(1),
"SYS_DateCreaERDF" : "2016-03-01T20:38:48Z"
}
和以下实体
public class EnlFluxF12Entry implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name="_id")
private ObjectId id;
@Column(name="SYS_FluxName")
public String sysFluxName;
@Column(name="SYS_ReadDateTime")
@Temporal(TemporalType.TIMESTAMP)
public Date sysReadDateTime;
@Column(name="SYS_BaseNameZip")
public String sysBaseNameZip;
@Column(name="SYS_Status")
public Long sysStatus;
@Column(name="SYS_DateCreaERDF")
public String sysDateCreaERDF;
public ObjectId getId(){
return id;
}
...
}
尝试查找()时,字段public Date sysReadDateTime会生成异常。
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: Could not set field value [TS time:Mon Jun 27 16:46:59 CEST 2016 inc:83] value by reflection : [class com.energielibre.middleware.service.mongodatalayergeneric.beans.EnlFluxF12Entry.sysReadDateTime] setter of com.energielibre.middleware.service.mongodatalayergeneric.beans.EnlFluxF12Entry.sysReadDateTime
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1619)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1106)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1033)
at org.hibernate.ogm.jpa.impl.OgmEntityManager.find(OgmEntityManager.java:97)
at com.energielibre.middleware.service.mongodatalayergeneric.Tester.main(Tester.java:30)
Caused by: org.hibernate.PropertyAccessException: Could not set field value [TS time:Mon Jun 27 16:46:59 CEST 2016 inc:83] value by reflection : [class com.energielibre.middleware.service.mongodatalayergeneric.beans.EnlFluxF12Entry.sysReadDateTime] setter of com.energielibre.middleware.service.mongodatalayergeneric.beans.EnlFluxF12Entry.sysReadDateTime
at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:58)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:607)
at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:220)
at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4573)
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:172)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:128)
at org.hibernate.ogm.loader.impl.OgmLoader.initializeEntitiesAndCollections(OgmLoader.java:812)
at org.hibernate.ogm.loader.impl.OgmLoader.doQuery(OgmLoader.java:393)
at org.hibernate.ogm.loader.impl.OgmLoader.doQueryAndInitializeNonLazyCollections(OgmLoader.java:283)
at org.hibernate.ogm.loader.impl.OgmLoader.loadEntity(OgmLoader.java:201)
at org.hibernate.ogm.loader.impl.OgmLoader.load(OgmLoader.java:157)
at org.hibernate.ogm.loader.impl.OgmLoader.load(OgmLoader.java:149)
at org.hibernate.ogm.loader.entity.impl.DynamicBatchingEntityLoaderBuilder$DynamicBatchingEntityLoader.load(DynamicBatchingEntityLoaderBuilder.java:116)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3956)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278)
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129)
at org.hibernate.internal.SessionImpl.access$2600(SessionImpl.java:164)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2696)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:975)
at org.hibernate.engine.spi.SessionDelegatorBaseImpl.get(SessionDelegatorBaseImpl.java:630)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1075)
... 3 more
Caused by: java.lang.IllegalArgumentException: Can not set java.util.Date field com.energielibre.middleware.service.mongodatalayergeneric.beans.EnlFluxF12Entry.sysReadDateTime to org.bson.types.BSONTimestamp
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.lang.reflect.Field.set(Field.java:764)
at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:38)
... 28 more
persistence.xml中
<?xml version="1.0"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="primary" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
<properties>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform"/>
<property name="hibernate.ogm.datastore.provider" value="mongodb" />
<property name="hibernate.ogm.datastore.database" value="heroku_6tp7jgpd" />
<property name="hibernate.ogm.datastore.host" value="*****" />
<property name="hibernate.ogm.datastore.port" value="*****" />
<property name="hibernate.ogm.datastore.username" value="*****" />
<property name="hibernate.ogm.datastore.password" value="*****" />
</properties>
</persistence-unit>
</persistence>
我应该使用MongoDB Timestamp类型将Date类型更改为sweet吗?
这个问题的问题在于,时间戳是MongoDB的内部类型,而Hibernate OGM无法将其转换为Java类型。
使用时:
@Column(name="SYS_ReadDateTime")
@Temporal(TemporalType.TIMESTAMP)
public Date sysReadDateTime;
Hibernate OGM将在数据库上创建如下内容:
"SYS_ReadDateTime" : "2017/01/11 11:52:28:493 +0000"
您有错误,因为事实并非如此。
据我所知,目前您有以下选择:
忽略该字段。 您真的需要阅读吗? 时间戳是内部的MongoDb类型,我不确定其他应用程序应该读取还是使用它。
使用本机查询。 我认为您也许可以使用本机查询读取值,然后在Java中立约。 您可以在有关本机查询的文档中找到更多详细信息。 使用本机查询时,您无需返回实体,这不是很方便,但可能会起作用。
您可以为Hibernate OGM提供补丁。 在MongoDBDialect#overrideType中,我们将MongoDB类型转换为Java类型。 我认为您需要类似于我们为ObjectID做的事情。 您可以查看org.hibernate.ogm.datastore.mongodb.type.impl包下的类。
创建扩展MongDBDialect并覆盖MongoDBDialect#overrideType方法的自己的方言,以便可以转换用于时间戳的值。 然后,您可以使用属性hibernate.ogm.datastore.grid_dialect
代替默认属性来使用它。
很抱歉,目前没有更简单的方法可以解决此问题,我们的路线图上提供了更通用的方法,以便用户可以传递自定义类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.