1

Which format should a postgresql field be retrieved in, for Hibernate to automatically deserialize it into an org.postgis.Point, or more generally an org.postgis.Geometry object?

Example:

@Formula("ST_PointOnSurface(surface)::geometry")
private Point pointOnSurface;

I have tried to wrap the above expression in ST_AsGeoJson, ST_AsBinary and other functions, but all result in the following exception when attempting to deserialize:

Caused by: org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:243)
    at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.java:287)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:139)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:114)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:28)
    at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:60)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:258)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:254)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:244)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:327)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2775)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1741)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1667)
    at org.hibernate.loader.Loader.getRow(Loader.java:1556)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:740)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:985)
    at org.hibernate.loader.Loader.doQuery(Loader.java:943)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
    at org.hibernate.loader.Loader.doList(Loader.java:2615)
    at org.hibernate.loader.Loader.doList(Loader.java:2598)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430)
    at org.hibernate.loader.Loader.list(Loader.java:2425)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1459)
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1426)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1398)
    at org.hibernate.Query.getResultList(Query.java:417)
    at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:72)
    at my.confidential.package.name.MyEntityDaoImpl.getAll(MyEntityDaoImpl.java:42)
    at sun.reflect.GeneratedMethodAccessor1168.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.__invoke(DelegatingMethodAccessorImpl.java:43)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:45009)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:45012)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    ... 34 common frames omitted
Caused by: java.io.StreamCorruptedException: invalid stream header: 30313031
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:866)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358)
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:309)
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:299)
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:218)
    ... 74 common frames omitted
  • PostgreSQL 12.3 with postgis extension
  • The column surface is of type geometry
  • Java 8
  • net.postgis:postgis-geometry:2.5.0
  • org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
  • Hibernate 5.2.4
  • Spring 4.3.25
5
  • 1
    I don't know why someone (Samuel Liew) deleted my answer for this question. Let me write it again: Use hibernate spatial. Check out baeldung.com/hibernate-spatial Commented Sep 7, 2020 at 7:02
  • @OnurBaştürk thank you. Now I have this related question: can I inject my own types into JDBC somehow, just like hibernate-spatial injects the Geometry types to work out-of-the-box, converting automatically between database representation and java object? Without using @Converter? Commented Sep 7, 2020 at 7:51
  • Well mapping custom types is much more complex than simple types but you can still do it using Hibernate. Check out baeldung.com/hibernate-custom-types Commented Sep 7, 2020 at 8:11
  • 1
    @OnurBaştürk You may post your comment as an answer to receive the bounty. Commented Sep 8, 2020 at 16:04
  • I posted it as answer, thanks Commented Sep 8, 2020 at 20:02

1 Answer 1

2
+50
  1. Use hibernate spatial. Check out https://www.baeldung.com/hibernate-spatial

  2. Mapping custom types is much more complex than simple types but you can still do it using Hibernate. Check out baeldung.com/hibernate-custom-types

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.