PostGIS Geometry saving: "Invalid endian flag value encountered."
pilladooo's solution works with spring boot 2.0.3, hibernate/spatial 5.2.17.Final, Postgres 9.5.
Column in entity in my case is defined as @Column(name = "geometry") private Geometry geometry;
and in database as type 'geometry' (to avoid bytea type that hibernate auto generates)
Firstly I solved 'Invalid endian flag value encountered' with adding columnDefinition = "geometry", but after that hibernate would fail schema validation with "Schema-validation: wrong column type encountered in column [geometry] in table [my_shema.my_geometry_table]; found [geometry (Types#OTHER)], but expecting [bytea (Types#VARBINARY)]"
after adding spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect it finally worked. ColumnDefinition is also redundant now
I solve this problem adding to 'application.properties' this line:
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
The solution seems to be the following:@Column
to map the field to the desired column with JPA annotations@Type
to specify the Hibernate mapping with the dialect.
@Column(columnDefinition = "Geometry", nullable = true)
@Type(type = "org.hibernate.spatial.GeometryType")
public Point centerPoint;
You could add the Hibernate property inside the hibernate.cfg.xml file to see the db request and try to catch the string-encoded problem with a text based editor like Notepad++ with "UTF-8"/"ANSI"/"other charsets"
<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
To add the hibernate properties you will have an hibernate.cfg.xml file with the following stuff. Don't copy/paste it because it is MySQL oriented. Just look where I have inserted the properties I evocated previously.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">true</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">db-password</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db-name</property>
<property name="hibernate.connection.username">db-username</property>
<property name="hibernate.default_entity_mode">pojo</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.search.autoregister_listeners">false</property>
**<property name="hibernate.show_sql">true</property>**
<property name="hibernate.use_sql_comments">false</property>
<mapping ressource="...." />
<!-- other hbm.xml mappings below... -->
</session-factory>
</hibernate-configuration>
Another way to log all sql is to add package specific properties inside a log4j.properties file:
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE
Good luck!