gpt4 book ai didi

spring - 使用 PostGIS Geometry Hibernate 持续失败

转载 作者:行者123 更新时间:2023-12-04 05:25:17 29 4
gpt4 key购买 nike

相关 previous question .我有一个 Spring Roo 应用程序,它使用 Hibernate 将 Geometry 对象写入使用 JTS 的 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 的声明,根据 my previous error !)

我现在的方言是 org.hibernate.spatial.dialect.postgis.PostgisDialect ,根据 Hibernate Spatial usage guide .我正在使用 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 一样简单!

See my thread on the mailing list for more information .

根据该线程,您还应该知道,从 Hibernate Spatial 4.0-M1 开始,只有 Geometry 类型被指定为 Hibernate,因此 @Column注释必须套装columnDefinition="Geometry" , 和 不是 Point或其他任何东西。这可能会在 future 修复。

有了这本修改选集,终于可以写一个Point到数据库了!正确的属性规范是:

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

关于spring - 使用 PostGIS Geometry Hibernate 持续失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12236428/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com