当前位置: 首页 > 面试题库 >

Hibernate使用PostGIS Geometry持续失败

孟鸿朗
2023-03-14
问题内容

与上一个问题有关。我有一个使用Hibernate的Spring
Roo应用程序,它使用JTS将Geometry对象写入PostGIS数据库。我相信我已经解决了定义我的Geometry对象时遇到的问题,现在Hibernate正在执行其persist()方法,但是在它到达数据库之前就出了问题,并且在下面出现了异常。

这是一些有趣的行。首先从Hibernate日志中,要持久化的对象,然后是一个SQL查询(大概替换了?):

...
DEBUG org.hibernate.pretty.Printer - com.test.LandUse{id=1, centerPoint=POINT (5 6), version=0}
...
DEBUG org.hibernate.SQL - insert into land_use (center_point, version, id) values (?, ?, ?)
...

然后发生了更多的事情,尽管没有明显不好的事情。但是,我看不到任何“最终” SQL,并且正在尝试回滚事务。然后:

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$afterReturning$org_springframework_transaction_aspectj_AbstractTransactionAspect$3$2a73e96c(AbstractTransactionAspect.aj:78)
    at com.test.LandUse_Roo_Jpa_ActiveRecord.ajc$interMethod$com_test_LandUse_Roo_Jpa_ActiveRecord$com_test_LandUse$persist(LandUse_Roo_Jpa_ActiveRecord.aj:44)
    at com.test.LandUse.persist(LandUse.java:1)
    at com.test.LandUse_Roo_Jpa_ActiveRecord.ajc$interMethodDispatch1$com_test_LandUse_Roo_Jpa_ActiveRecord$com_test_LandUse$persist(LandUse_Roo_Jpa_ActiveRecord.aj)
    at com.test.LandUseController_Roo_Controller.ajc$interMethod$com_test_LandUseController_Roo_Controller$com_test_LandUseController$create(LandUseController_Roo_Controller.aj:29)
    at com.test.LandUseController.create(LandUseController.java:1)
...
Caused by: javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
    ... 54 more
Caused by: java.lang.UnsupportedOperationException
    at org.hibernate.spatial.GeometrySqlTypeDescriptor.getBinder(GeometrySqlTypeDescriptor.java:52)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278)
    at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:89)
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2184)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2430)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2874)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
    ... 55 more

我一直在努力使这个简单的用例(一个只有一个Geometry属性的对象)工作了一个多星期,并且已经不知所措了。如果我用String替换Geometry对象,它就可以正常工作。有谁知道是什么原因导致这种错误?

编辑:
Thierry在下面的回答让我戳了一下源代码,并且我注意到抛出了异常GeometrySqlTypeDescriptor,其中包含一些有趣的内容:

/**
 * A generic <code>SqlTypeDescriptor</code>, intended to be remapped
 * by the spatial dialect.
 *
 * @author Karel Maesen, Geovise BVBA
 *         creation-date: 7/27/11
 */
public class GeometrySqlTypeDescriptor implements SqlTypeDescriptor {

    public static final GeometrySqlTypeDescriptor INSTANCE = new GeometrySqlTypeDescriptor();

    @Override
    public int getSqlType() {
        return 3000; //this value doesn't conflict with presently defined java.sql.Types values.
    }

    @Override
    public boolean canBeRemapped() {
        return true;
    }

    @Override
    public <X> ValueBinder<X> getBinder(JavaTypeDescriptor<X> javaTypeDescriptor) {
        throw new UnsupportedOperationException();
    }

    @Override
    public <X> ValueExtractor<X> getExtractor(JavaTypeDescriptor<X> javaTypeDescriptor) {
        throw new UnsupportedOperationException();
    }
}

特别要注意的是,类注释暗示了Hibernate方言映射显然存在问题。不幸的是,我不知道这意味着什么,但是由于某种版本的不匹配,我正在猜测。(另请注意,根据我之前的错误,声明了SQL类型3000的声明!)

org.hibernate.spatial.dialect.postgis.PostgisDialect根据Hibernate
Spatial使用指南,我当前的方言是。我正在使用Hibernate
Spatial 4.0-M1,JTS 1.12和PostGIS 2.0.1。我可能会尝试使用几种不同版本的PostGIS,尤其是因为这是Hibernate
Spatial应该提供但似乎没有提供的依赖项。


问题答案:

似乎问题在于未正确拾取PostgisDialect并将其正确集成,因此不支持所需的操作。解决方案就像从Hibernate
3.6.9.Final升级到4.1.6.Final一样简单!

有关更多信息,请参见邮件列表中的主题。

根据该线程,您还应该知道,从Hibernate Spatial
4.0-M1开始,只有Geometry类型指定为Hibernate,因此@Column注释 必须
设置columnDefinition="Geometry",而 不是 set Point。将来可能会解决此问题。

通过这种修改,我终于可以将Point写入数据库了!正确的属性规范是:

@Column(columnDefinition="Geometry")
@Type(type = "org.hibernate.spatial.GeometryType")
private Point centerPoint;


 类似资料:
  • 与上一个问题有关。我有一个SpringRoo应用程序,它使用Hibernate使用JTS将几何体对象写入PostGIS数据库。我相信我已经解决了定义Geometry对象时遇到的问题,现在Hibernate正在执行其persist()方法,但是在它到达DB之前出现了一些问题,我得到了下面的异常。 这里有一些有趣的台词。首先从Hibernate日志、要持久化的对象,然后是一个SQL查询(可能替换了?)

  • 它们还提供了一个警告:如果您能够持续部署到测试系统,有时也会使用术语“持续部署”。 这一切让我很困惑。任何更详细的解释(或附带一个例子)都是赞赏的!

  • 问题内容: 我需要一个Python / C / C ++ / Java实现,可以 暂停散列进步 和 商店 ,在这样一个文件进度的进展是 可恢复 从该文件在稍后阶段。 无论上面列出的是哪种语言编写的,它都应该可以在Python中正常工作。建议您提供它以便与“ hashlib”一起良好地工作,但这不是必需的。同样,如果已经存在这样的事物,那么到此的链接就足够了。 对于一个想法 ,您的实现应该实现什么。

  • 我需要使用API V3获取YouTube内容长度。我的应用程序在API V3上运行良好,但现在不起作用了。 我发现了一个可行的例子,它确实有效: 学分: Youtube API v3 ,如何获取视频时长? 这将返回类似如下的时间格式。 我怎样才能把这个时间缩短到一个可读的时间呢。比如24:30?

  • 流水线功能提供给用户统一的视图来管理应用自动发布规则,您可通过此功能来自动发布自有主机或DCE混合云环境下的应用 设置自动发布规则 进入构建项目页,选择流水线 点击右侧 development 面板中的添加一个新应用, 输入应用的名字,我们可以搜索到使用该项目的应用 点击应用的“设置发布规则”来设置自动部署规则。 根据此规则,当源码的 master 分支更新时会自动触发CI与构建,并自动发布新版本

  • 问题内容: 如何建立持续集成标签而不是分支的实践? 我具有标签存储库目录的以下结构: 我想配置我的持续集成工具(可以是CruiseControl,Hudson和Jenkins到TeamCity的任何工具),以在两个文件夹中的任何一个中创建了最新标记。 例如,如果结构已更改并且标签已出现在目录中,我想触发标签下的源代码构建: 是否可以使用任何现有的持续集成工具在标签下构建源代码,或者为此目的我应该编