web-dev-qa-db-fra.com

Hibernate Spatial 5 - Type de géométrie

Après la mise à niveau de Hibernate-spatial vers la version 5.0.0.CR2, la déclaration suivante ne fonctionne plus:

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

avec un:

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

Comme je peux le voir, la classe n'existe plus dans le fichier Jar. Qu'est-ce qui est arrivé au GeometryType et comment est-il remplacé? Ou y a-t-il un autre fichier jar à inclure?

Edit: pour clarification. J'utilise Hibernate-Spatial en combinaison avec une base de données PostgreSQL-Postgis.

24
Denis Lukenich

Eh bien, la solution est trop facile à voir. Supprimez simplement l'annotation @Type pour que la déclaration ressemble à ceci:

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

La source :

Notez l'annotation @Type. Cela informe Hibernate que l'attribut location est de type Geometry. L'annotation @Type est spécifique à Hibernate et est la seule annotation non JPA requise. (Dans les futures versions d'Hibernate (versions 5 et supérieures), il ne sera plus nécessaire de déclarer explicitement le type d'attributs à valeur géométrique.)

32
Denis Lukenich

La solution proposée par Denis ci-dessus n'a pas fonctionné pour moi sur Hibernate 5 spatial et Mysql. Cependant, les annotations suivantes ont fonctionné pour moi

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


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

Donc, je lutte contre ce problème depuis quelques jours. Le fait est que je voulais que le type de base de données soit du type postgis afin de pouvoir exécuter des requêtes de distance efficaces pour le plus proche voisin, etc. J'ai enfin compris comment le faire. et je voulais le partager avec la communauté, alors j’ai créé un projet de démonstration contenant la solution au problème.

Ma configuration est une base de données PostgreSQL avec Postgis, Spring Boot jpa, Hibernate 5+, Hibernate-spatial 5+ et également la conversion en sortie restante, qui nécessitait à nouveau un module spécial de Jackson.

le projet se trouve sur https://github.com/Wisienkas/springJpaGeo

le code important que vous demandiez était le suivant:

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

Pour Hibernate Spatial 5.2.x, tout ce dont vous avez besoin est le suivant dans votre entité.

private Point location;

Vous n'avez pas besoin de columnDefinition ou de type comme les solutions mentionnées ci-dessus.

Quelques détails supplémentaires et vérifications pour voir si cela fonctionne

  • Dès que vous exécutez votre configuration et utilisez desc table_name dans mysql, vous devriez voir le type de champ de geometry . Cela indique que le mappage de veille prolongée à la base de données fonctionne correctement.
  • Maintenant, essayez de créer une entité et repo.save (entité) à partir de Java et votre entité devrait économiser sans erreur.

Si la configuration ci-dessus ne fonctionne pas bien, vous obtiendrez généralement l'erreur

Troncature de données: impossible d'obtenir l'objet géométrique des données que vous envoyez au champ GEOMETRY Blockquote

J'espère que cela aide quelqu'un à économiser 6 heures que j'ai perdues!

2
HopeKing

J'utilise hibernate 4.3.6 et hibernate spatial 5.2.2. La solution suggérée ci-dessus n'a pas fonctionné pour moi ... Cependant, le code ci-dessous a fonctionné si j'ajoutais hibernate spatial 4.3 

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