it-swarm.com.de

Hibernate Spatial 5 - GeometryType

Nach dem Upgrade von Hibernate-räumlich auf Version 5.0.0.CR2 funktioniert die folgende Deklaration nicht mehr:

@Column(columnDefinition = "geometry(Point,4326)")
@Type(type = "org.hibernate.spatial.GeometryType")
private Point position;

mit einem:

org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.spatial.GeometryType]

Wie ich sehen kann, existiert die Klasse nicht mehr in der Jar-Datei. Was ist mit dem GeometryType passiert und wie wird er ersetzt? Oder gibt es eine weitere Jar-Datei, die aufgenommen werden soll?

Edit: Zur Verdeutlichung. Ich verwende Hibernate-Spatial in Kombination mit einer PostgreSQL-Postgis-Datenbank.

24
Denis Lukenich

Nun, die Lösung ist zu leicht zu sehen. Löschen Sie einfach die @Type-Annotation, damit die Deklaration folgendermaßen aussieht:

@Column(columnDefinition = "geometry(Point,4326)")
private Point position;

Quelle :

Beachten Sie die @Type-Annotation. Dies informiert Hibernate darüber, dass das Standortattribut vom Typ Geometrie ist. Die @Type-Annotation ist hibernatenspezifisch und die einzige Nicht-JPA-Annotation, die erforderlich ist. (In zukünftigen Versionen von Hibernate (Version 5 und höher) ist es nicht mehr erforderlich, die Attribute mit Typ der Geometrie explizit zu deklarieren.)

32
Denis Lukenich

Die oben von Denis vorgeschlagene Lösung funktionierte bei Hibernate 5 räumlich und Mysql nicht. Die folgenden Anmerkungen funktionierten jedoch für mich

  @Column(name = "location",columnDefinition="Geometry")
  private Geometry location;


  @Column(name = "pointlocation",columnDefinition="Point")
  private Point pointlocation;
5
Ganesh Krishnan

Ich habe dieses Problem also seit ein paar Tagen bekämpft. Ich wollte, dass der Datenbanktyp vom Postgis-Typ ist, damit ich effiziente Abstandsabfragen für den nächsten Nachbarn ausführen kann. Ich habe schließlich herausgefunden, wie das geht und wollte es mit der Community teilen, also habe ich ein Demo-Projekt erstellt, das die Lösung des Problems enthält.

Mein Setup ist eine PostgreSQL-Datenbank mit Postgis, Spring Boot-Jpa, Hibernate 5+, Hibernate-Spatial 5+ und zusätzlichem Konvertieren in Rest-Ausgabe, was wiederum ein spezielles Modul von Jackson erfordert.

das Projekt befindet sich unter https://github.com/Wisienkas/springJpaGeo

der wichtige Code, nach dem Sie gefragt haben, war folgender:

@type(type = "jts_geometry")
private Point point;
2
Wisienkas

Für Hibernate Spatial 5.2.x benötigen Sie lediglich das Folgende in Ihrer Entität.

private Point location;

Sie benötigen keine columnDefinition oder Type wie die oben genannten Lösungen.

Einige zusätzliche Details und Überprüfungen, um zu sehen, ob das obige funktioniert

  • Sobald Sie Ihr Setup ausführen und desc table_namein mysql verwenden, sollten Sie den Feldtyp von geometrie sehen. Dies zeigt an, dass Ihr Hibernate für die Datenbankzuordnung einwandfrei funktioniert.
  • Versuchen Sie nun, eine Entität und repo.save (Entität) aus Java zu erstellen, und Ihre Entität sollte fehlerfrei gespeichert werden.

Wenn das obige Setup nicht gut funktioniert hat, wird normalerweise der Fehler angezeigt

Datenkürzung: Geometrieobjekt kann nicht aus Daten abgerufen werden, die Sie an das GEOMETRY-Feld senden Blockquote

Hoffe, das hilft jemandem, 6 Stunden zu sparen, die ich verschwendet habe!

2
HopeKing

Ich verwende Hibernate 4.3.6 und Hibernate räumliche 5.2.2. Die oben vorgeschlagene Lösung hat bei mir nicht funktioniert ..__Der folgende Code hat jedoch funktioniert, wenn ich räumlichen 4.3 

@Type(type="org.hibernate.spatial.GeometryType")
private Point location;
0
Hasnu zama