mapear example enumerated enum data java hibernate postgresql jpa

java - example - spring data jpa enum mapping



Utilice el tipo de punto con PostgreSQL y JPA/Hibernate (4)

Como no estoy completamente seguro de la pregunta, permítame primero parafrasear:

Desea asignar una entidad que tenga un campo de tipo com.vividsolutions.jts.geom.Point a una columna de la base de datos PostgreSQL de tipo "punto" ( consulte los tipos geométricos de postgreSQL ) usando hibernación, restringiéndose a sí mismo al "estándar" (es decir, hibernación proporcionado) dialecto PostgreSQLDialect .

Algunas investigaciones me llevan a la conclusión de que el dialecto estándar compatible con hibernación mencionado anteriormente no es compatible con el tipo de punto PostgreSQL. Así que es posible que desee proporcionar su propio UserType . Mire los tipos personalizados en el manual de hibernación o Comprenda y escriba los tipos de usuarios personalizados de hibernación para ver un ejemplo de un blog.

¿Hay alguna forma de asignar la columna de puntos al campo de entidad de Java?

Probé Hibernate Spatial 4.0, pero parece que no funciona con PostgreSQL puro sin PostGIS. Aquí está la definición del campo de punto:

import com.vividsolutions.jts.geom.Point; ... @Column(columnDefinition = "point") @Type(type = "org.hibernate.spatial.GeometryType") private Point location;

Dialecto en persistencia.xml:

<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect" />

Y cuando intento persistir esta entidad, se lanza una excepción:

org.postgresql.util.PSQLException: Unknown type geometry. at org.postgresql.jdbc2.AbstractJdbc2Statement.setPGobject(AbstractJdbc2Statement.java:1603) at org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1795) at org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:37) at org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:46) at org.hibernate.spatial.dialect.AbstractJTSGeometryValueBinder.bind(AbstractJTSGeometryValueBinder.java:48) at org.hibernate.spatial.dialect.AbstractJTSGeometryValueBinder.bind(AbstractJTSGeometryValueBinder.java:39) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275) at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)

Entonces parece que intenta persistir el valor como tipo de geometría de PostGIS. Pero quiero usar solo un punto simple.


Debería intentar tener el tipo en su base de datos como Geometría, tampoco lo he logrado con mySQL. La geometría funciona tan bien para los puntos.


INSTALE LAS EXTENSIONES DE POSTGIS EN SU BASE DE DATOS.

El error con el que se encuentra es porque no ha instalado nada en su base de datos con el que Hibernate pueda relacionarse. Es postgres que se queja, a saber:

org.postgresql.util.PSQLException: Geometría de tipo desconocido.

Sus anotaciones y configuración dicen que tienen una dependencia en PostGIS:

<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect" />

Básicamente, está intentando utilizar una configuración no compatible.

PostgreSQL no viene con todos los tipos de datos posibles que alguien haya pensado, como lo hace Oracle. Entonces, cuando Hibernate dice "Quiero una ''geometría'', PostgreSQL simplemente dice" ¿qué es una geometría? "PostgreSQL es muy extensible, así que eso es lo que hizo la gente de PostGIS: construyeron una extensión. Cualquiera puede instalarla o correr completamente sin ella. El único problema lo que ocurre es cuando alguien lo espera en la base de datos lista para usar en lugar de ser un complemento.

Supongo que podría intentar aplicar ingeniería inversa a los tipos de datos de PostgreSQL y compilarlos en su base de datos. La geometría es una superclase maestra para PostGIS, al menos en Java y se ve igual en la base de datos. Simplemente no veo por qué configuraría una configuración cuando nunca logrará que alguien la respalde.

@bluish te ayuda?


Puedo ofrecer una forma más universal a través de @Embedded Entity ( ¡no depende del tipo de base de datos! ), Que he usado en proyectos.

Ejemplo a continuación:

Pieza de consulta SQL para crear una tabla con LAT y LONG:

CREATE TABLE some_table ( lat NUMBER(..., ...), long NUMBER(..., ...), ... );

Entidad punto de inserción:

@Embeddable public class Point { private BigDecimal x; private BigDecimal y; ... }

Su entidad personalizada:

@Entity @Table(name = "some_table") public class SomeEntity { @Embedded @AttributeOverrides({ @AttributeOverride(name = "lat", column = @Column(name = "x")), @AttributeOverride(name = "long", column = @Column(name = "y")) }) private Point point; ... }