繁体   English   中英

休眠ogm mongodb时间戳

[英]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"

您有错误,因为事实并非如此。

据我所知,目前您有以下选择:

  1. 忽略该字段。 您真的需要阅读吗? 时间戳是内部的MongoDb类型,我不确定其他应用程序应该读取还是使用它。

  2. 使用本机查询。 我认为您也许可以使用本机查询读取值,然后在Java中立约。 您可以在有关本机查询的文档中找到更多详细信息。 使用本机查询时,您无需返回实体,这不是很方便,但可能会起作用。

  3. 您可以为Hibernate OGM提供补丁。 MongoDBDialect#overrideType中,我们将MongoDB类型转换为Java类型。 我认为您需要类似于我们为ObjectID做的事情。 您可以查看org.hibernate.ogm.datastore.mongodb.type.impl包下的类。

  4. 创建扩展MongDBDialect并覆盖MongoDBDialect#overrideType方法的自己的方言,以便可以转换用于时间戳的值。 然后,您可以使用属性hibernate.ogm.datastore.grid_dialect代替默认属性来使用它。

很抱歉,目前没有更简单的方法可以解决此问题,我们的路线图上提供了更通用的方法,以便用户可以传递自定义类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM