我需要将地理空间信息,特别是“点”添加到MySQL数据库的条目(v5.5.28)。我尝试使用简单的代码将创建的列“location”映射到我的java EJB实体ServiceInfo的相应属性:
@Column(name = "location")
private com.vividsolutions.jts.geom.Point location;
但是,这会导致以下错误:
Exception [EclipseLink-66] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Could not deserialize object from byte array.
Internal Exception: java.io.StreamCorruptedException: invalid stream header: 00000000
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[location-->ServiceInfo.location]
Descriptor: RelationalDescriptor(ies.persistence.entity.ServiceInfo --> [DatabaseTable(ServiceInfo)])
at org.eclipse.persistence.exceptions.DescriptorException.notDeserializable(DescriptorException.java:1218)
at org.eclipse.persistence.mappings.converters.SerializedObjectConverter.convertDataValueToObjectValue(SerializedObjectConverter.java:72)
...
我认为问题是java mysql连接器(v5.1.22)不支持地理空间信息,这使我感到惊讶,因为数据库确实如此。有人可以确认是这种情况,或者告诉我我可能做错了什么并指出我正确的方向?
我正在使用JDK 1.7和GlassFish Server 3.1.2
在Netbeans 7.2中工作答案 0 :(得分:-1)
好的,所以我最后通过对持久层进行了以下更改来修复我的问题:
我使用空间扩展PostGIS从MySQL数据库切换到PostgeSQL数据库。原因是MySQL只部分实现了OpenGIS规范。 接下来,我不得不将EclipseLink(JPA 2.0)(默认)的持久性单元更改为Hibernate(JPA 2.0)。
包含在我的项目和glassfish的类路径中的jar(其他似乎无法找到它们。我必须将它们复制到domain1的根目录)是:
生成的persistence.xml文件为:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<persistence-unit name="IES-ejbPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/postgresql_iesdb3</jta-data-source>
<class>ies.persistence.entity.ServiceInfo</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
用于我的EJB权利的注释是:
@Type(type="org.hibernate.spatial.GeometryType")
@Column(name = "location", columnDefinition="Geometry")
private com.vividsolutions.jts.geom.Geometry location;
我们现在使用Hibernate + JPA + PostgeSQL / PostGIS进行了正确的映射。