2017-02-04 22 views
0

Я работаю над проектом, где я буду получать широту и долготу пользователя. Из этого я хотел бы сохранить его в базе данных как Point. Однако, когда я пытаюсь сделать так, я побежал в следующее сообщение об ошибке: o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: Invalid endian flag value encountered.Сопоставление с com.vividsolutions.jts.geom.Point недействительным флагом endian

Я принимаю модель, которая подвергается стороне клиента и отображение его следующим образом:

public static Point createPoint(double longitude, double latitude){ 
     GeometryFactory gf = new GeometryFactory(); 

     Coordinate coord = new Coordinate(longitude, latitude); 
     Point point = gf.createPoint(coord); 

     return point; 
    } 

Так что я бы назвал это метод примерно следующим образом, чтобы отобразить значение в виде точки:

createPoint(user.getLocation().getLongitude(), user.getLocation().getLatitude()); 

Какой бы я тогда сохранил возвращаемое значение в базе данных.

Мой файл ПОМ имеет следующие зависимости: конфигурации

<dependency> 
     <groupId>com.vividsolutions</groupId> 
     <artifactId>jts</artifactId> 
     <version>1.13</version> 
    </dependency> 
    <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-spatial</artifactId> 
      <version>5.2.4.Final</version> 
       <exclusions> 
        <exclusion> 
         <artifactId>postgresql</artifactId> 
         <groupId>postgresql</groupId> 
        </exclusion> 
       </exclusions> 
    </dependency> 

JPA: определение

jpa: 
     database: POSTGRESQL 
     open-in-view: false 
     show-sql: true 
     hibernate: 
      ddl-auto: none 
      dialect: org.hibernate.spatial.dialect.postgis.PostgisDialect 
      naming: 
       naming-strategy: org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy 

Колонка:

@Column(name="point") 
private com.vividsolutions.jts.geom.Point point; 

Любые идеи, как я могу исправить эту ошибку? Спасибо, ребята, заранее.

+1

Не уверен, если поняли ваш correctyl, но не 'javax.persistence.AttributeConverter', что вы ищете для? – Artegon

ответ

1

Есть несколько способов сделать это, и все зависит от того, как именно вы хотите, чтобы данные хранились в базовом хранилище данных.

Как было отмечено в комментариях, вы могли бы использовать AttributeConverter реализацию для хранения x, y и z компоненты координат Point «s в одной колонке с разделителями некоторым магическим характером:

public class PointerConverter implements AttributeConverter<Point, String> { 
    @Override 
    public String converToDatabaseColumn(Point point) { 
    // read the x, y, z, construct a string delimited by some character and 
    // return the value. Hibernate will store this in your column. 
    } 

    @Override 
    public Point convertToEntityAttribute(String value) { 
    // split the value by the delimiter and construct a Point. 
    // return the constructed Point to be set in the entity. 
    } 
} 

Одной из неотъемлемых проблем с этим подходом является то, что он делает запрос к различным частям координат Point практически невозможным.

Если вы обнаружите, что вам нужно, чтобы иметь возможность запрашивать против Point и поставлять различные x, y или z значения, которые составляют Координирует Point «s, то вы будете лучше, учитывая:

  • Таможня UserType реализация
  • Использование @Embeddable для представления вашего Point в мире персистентности.

Для пользовательских UserType, вы должны определить новый тип, вероятно, под названием PointType в этом примере, который простирается UserType, и ссылаться на него, как следующее:

@Type(type = "PointType") 
@Columns({@Column(name = "X"), @Column(name="Y"), @Column(name="Z")) 
private Point point; 

Обычай UserType будет обрабатывать отображение x, y и z частей координат точки в соответствующие столбцы X, Y и Z и наоборот.

@Embeddable Для решения, вы бы просто создать свой собственный JpaPoint класс, который вы можете пройти в классе геометрии Point для того, чтобы прочитать x, y и z значения и сохранить их в 3-х свойств модели инерционности. JpaPoint класса мог бы также выставить вспомогательный метод позволяет абоненту сгенерировать Point из JpaPoint встраиваемых:

// ctor example 
public JpaPoint(Point point) { 
    this.x = point.getCoordinates().x; 
    this.y = point.getCoordinates().y; 
    this.z = point.getCoordinates().z; 
} 

// helper method 
@Transient 
public Point getPoint() { 
    return new Point(new Coordinates(x, y, z)); 
} 
+0

Большое вам спасибо за ваш ответ в глубину. Я также попытался создать еще один класс утилиты для преобразования из lon/lat в «com.vividsolutions.jts.geom.Point point» с помощью WKTReader & writer и по-прежнему не повезло. Я собираюсь поиграть с твоей последней идеей и вместо этого создать вложенную точку, как ты предложил, - это должно сделать трюк. Еще раз спасибо! – Dayna

+0

Пожалуйста, можете ли вы поместить свой AttributeConverter для JPAPoint (Embeddable) в Point (vividsolutions)? Спасибо – joseaio