我最近发现了在处理项目中的地理类型时使用JTS库的潜力。我正在使用hibernate作为我的ORM(包括hibernate空间)。
在知道JTS的存在之前,我将坐标存储在名为LatLon的自定义类中;每当我想管理折线时,我都会创建一个列表,例如名单。在数据库中进行CRUD操作时,我意识到它的性能有多糟糕。
所以,正如我之前告诉过你的,我发现我的LatLon类可以被JTS的Point类取代。我开始实现它并替换LatLon属性,但我有几个问题:
我使用XML(而不是注释)映射我的类。以下是否正确?
(Java类)
...
private Point puntoInicio;
...
(XML映射)
<property name="puntoInicio" type="org.hibernate.spatial.GeometryType" column="RUTA_PUNTOINICIO" not-null="true" />
如何存储折线?我没有找到任何名为Polyline的数据类型。但是,我发现其他人喜欢LineString。我可以用它来表示折线吗?我如何映射它们?
非常感谢你!
编辑:我正在使用Hibernate 5.0.7.Final + Hibernate Spatial 5.0.7.Final
编辑2:对不起我的延迟和不接受任何答复。我不久前解开了整个修改,但我想修改并实现这种方式。感谢您的时间和耐心。
答案 0 :(得分:0)
我已经能够使其工作不指定列的类型并将Hibernate和Hibernate Spatial更新为5.这样,数据就存储为二进制。问题出现了,我有一个名为“Conductor”的类,当从数据库中检索数据时,Hibernate会引发异常:
Error Exception: could not deserialize
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:138)
at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:113)
at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:27)
at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:53)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:238)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:234)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:224)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:300)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2727)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1728)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1654)
at org.hibernate.loader.Loader.getRow(Loader.java:1543)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:727)
at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
at org.hibernate.loader.Loader.doQuery(Loader.java:930)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2611)
at org.hibernate.loader.Loader.doList(Loader.java:2594)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)
at org.hibernate.loader.Loader.list(Loader.java:2418)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
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:1326)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
...
//stuff from my webapp
...
Caused by: java.io.StreamCorruptedException: invalid stream header: 01303130
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
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)
... 85 more