diff --git a/composites/ebean-net-postgis/pom.xml b/composites/ebean-net-postgis/pom.xml
new file mode 100644
index 0000000000..80f0c48c0d
--- /dev/null
+++ b/composites/ebean-net-postgis/pom.xml
@@ -0,0 +1,85 @@
+
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 14.4.0
+ ../..
+
+
+ ebean-net-postgis
+ ebean-net-postgis composite
+ ebean-net-postgis
+
+
+ 2023.1.0
+ 42.7.2
+
+
+
+
+
+ io.ebean
+ ebean-api
+ 14.4.0
+
+
+
+ io.ebean
+ ebean-core
+ 14.4.0
+
+
+
+ io.ebean
+ ebean-datasource
+ ${ebean-datasource.version}
+
+
+
+ io.ebean
+ ebean-migration
+ ${ebean-migration.version}
+
+
+
+
+ io.ebean
+ ebean-querybean
+ 14.4.0
+
+
+
+ io.ebean
+ ebean-platform-postgres
+ 14.4.0
+
+
+
+ io.ebean
+ ebean-net-postgis-types
+ 14.4.0
+
+
+
+ org.postgresql
+ postgresql
+ ${postgres.jdbc.version}
+
+
+
+ *
+ *
+
+
+
+
+
+ net.postgis
+ postgis-jdbc
+ ${postgis.jdbc.version}
+
+
+
+
diff --git a/composites/ebean-net-postgis/src/main/java/io/ebean/postgis/assembly/Assembly.java b/composites/ebean-net-postgis/src/main/java/io/ebean/postgis/assembly/Assembly.java
new file mode 100644
index 0000000000..fea71cbb3d
--- /dev/null
+++ b/composites/ebean-net-postgis/src/main/java/io/ebean/postgis/assembly/Assembly.java
@@ -0,0 +1,7 @@
+package io.ebean.postgis.assembly;
+
+/**
+ * Nothing interesting here - required placeholder for javadoc.
+ */
+public class Assembly {
+}
diff --git a/composites/ebean-net-postgis/src/main/java/module-info.java b/composites/ebean-net-postgis/src/main/java/module-info.java
new file mode 100644
index 0000000000..63bf6fcb15
--- /dev/null
+++ b/composites/ebean-net-postgis/src/main/java/module-info.java
@@ -0,0 +1,10 @@
+module io.ebean.postgis {
+
+ requires transitive io.ebean.api;
+ requires transitive io.ebean.core;
+ requires transitive io.ebean.datasource;
+ requires transitive io.ebean.querybean;
+ requires transitive io.ebean.platform.postgres;
+ // requires transitive io.ebean.postgis.types;
+
+}
diff --git a/composites/pom.xml b/composites/pom.xml
index dbc3de1a75..5afd41e421 100644
--- a/composites/pom.xml
+++ b/composites/pom.xml
@@ -24,6 +24,7 @@
ebean-oracle
ebean-postgres
ebean-postgis
+ ebean-net-postgis
ebean-sqlite
ebean-sqlserver
diff --git a/ebean-api/src/main/java/module-info.java b/ebean-api/src/main/java/module-info.java
index be58361b4b..06bc066d68 100644
--- a/ebean-api/src/main/java/module-info.java
+++ b/ebean-api/src/main/java/module-info.java
@@ -8,6 +8,7 @@
uses io.ebean.service.SpiRawSqlService;
uses io.ebean.service.SpiProfileLocationFactory;
uses io.ebean.service.SpiFetchGroupService;
+ uses io.ebean.service.SpiJsonService;
requires transitive java.sql;
requires transitive io.avaje.config;
diff --git a/ebean-core/src/main/java/module-info.java b/ebean-core/src/main/java/module-info.java
index d12bd34828..5560c21530 100644
--- a/ebean-core/src/main/java/module-info.java
+++ b/ebean-core/src/main/java/module-info.java
@@ -47,7 +47,7 @@
exports io.ebeanservice.docstore.api.support to io.ebean.elastic, io.ebean.test;
exports io.ebeanservice.docstore.api.mapping to io.ebean.elastic;
- exports io.ebeaninternal.api to io.ebean.ddl.generator, io.ebean.querybean, io.ebean.autotune, io.ebean.postgis, io.ebean.test, io.ebean.elastic, io.ebean.spring.txn;
+ exports io.ebeaninternal.api to io.ebean.ddl.generator, io.ebean.querybean, io.ebean.autotune, io.ebean.postgis, io.ebean.test, io.ebean.elastic, io.ebean.spring.txn, io.ebean.postgis.types;
exports io.ebeaninternal.api.json to io.ebean.test;
exports io.ebeaninternal.json to io.ebean.test;
exports io.ebeaninternal.server.autotune to io.ebean.autotune;
@@ -69,7 +69,7 @@
exports io.ebeaninternal.server.querydefn to io.ebean.autotune, io.ebean.querybean, io.ebean.test, io.ebean.elastic;
exports io.ebeaninternal.server.rawsql to io.ebean.test;
exports io.ebeaninternal.server.json to io.ebean.test, io.ebean.elastic;
- exports io.ebeaninternal.server.type to io.ebean.postgis, io.ebean.test;
+ exports io.ebeaninternal.server.type to io.ebean.postgis, io.ebean.test, io.ebean.postgis.types;
exports io.ebeaninternal.server.transaction to io.ebean.test, io.ebean.elastic, io.ebean.spring.txn, io.ebean.k8scache;
exports io.ebeaninternal.server.util to io.ebean.querybean;
diff --git a/ebean-ddl-generator/src/main/java/module-info.java b/ebean-ddl-generator/src/main/java/module-info.java
index d3a8affe56..50a8c62311 100644
--- a/ebean-ddl-generator/src/main/java/module-info.java
+++ b/ebean-ddl-generator/src/main/java/module-info.java
@@ -15,4 +15,6 @@
// support existing tests
exports io.ebeaninternal.extraddl.model to io.ebean.test;
+
+ opens io.ebeaninternal.extraddl.model to jakarta.xml.bind;
}
diff --git a/ebean-net-postgis-types/.editorconfig b/ebean-net-postgis-types/.editorconfig
new file mode 100644
index 0000000000..d67326c696
--- /dev/null
+++ b/ebean-net-postgis-types/.editorconfig
@@ -0,0 +1,17 @@
+# editorconfig.org
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+spaces_around_operators = true
+max_line_length = 130
+
+[pom.xml]
+# Because of
+
+ 4.0.0
+
+ ebean-parent
+ io.ebean
+ 14.4.0
+
+
+ ebean net postgis types
+ ebean-net-postgis-types
+
+
+ 2023.1.0
+
+
+
+
+
+ io.ebean
+ ebean-platform-postgres
+ 14.4.0
+
+
+
+
+ io.ebean
+ ebean-core
+ 14.4.0
+ provided
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ ${jackson.version}
+ true
+
+
+
+ net.postgis
+ postgis-jdbc
+ ${postgis.jdbc.version}
+
+
+
+
+ org.postgresql
+ postgresql
+ 42.7.2
+ provided
+
+
+
+ io.ebean
+ ebean-test
+ 14.4.0
+ test
+
+
+
+ org.avaje.composite
+ logback
+ 1.1
+ test
+
+
+
+
+
+
+
+
+
+ io.repaint.maven
+ tiles-maven-plugin
+ 2.40
+ true
+
+
+ io.ebean.tile:enhancement:14.3.0
+
+
+
+
+
+
+
+
+
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisExtraTypeFactory.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisExtraTypeFactory.java
new file mode 100644
index 0000000000..72a731c76a
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisExtraTypeFactory.java
@@ -0,0 +1,23 @@
+package io.ebean.postgis;
+
+import io.ebean.DatabaseBuilder;
+import io.ebean.core.type.ExtraTypeFactory;
+import io.ebean.core.type.ScalarType;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class PostgisExtraTypeFactory implements ExtraTypeFactory {
+
+ @Override
+ public List> createTypes(DatabaseBuilder.Settings config, Object objectMapper) {
+ return Arrays.asList(
+ new ScalarTypePgisPoint(),
+ new ScalarTypePgisPolygon(),
+ new ScalarTypePgisLineString(),
+ new ScalarTypePgisMultiPolygon(),
+ new ScalarTypePgisMultiPoint(),
+ new ScalarTypePgisMultiLineString()
+ );
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBindProvider.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBindProvider.java
new file mode 100644
index 0000000000..be7fdc273f
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBindProvider.java
@@ -0,0 +1,13 @@
+package io.ebean.postgis;
+
+import io.ebean.DatabaseBuilder;
+import io.ebeaninternal.api.GeoTypeProvider;
+import io.ebeaninternal.server.type.GeoTypeBinder;
+
+public class PostgisGeoTypeBindProvider implements GeoTypeProvider {
+
+ @Override
+ public GeoTypeBinder createBinder(DatabaseBuilder.Settings config) {
+ return new PostgisGeoTypeBinder();
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBinder.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBinder.java
new file mode 100644
index 0000000000..f24ee37d38
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/PostgisGeoTypeBinder.java
@@ -0,0 +1,21 @@
+package io.ebean.postgis;
+
+import io.ebean.core.type.DataBinder;
+import io.ebeaninternal.server.type.GeoTypeBinder;
+import net.postgis.jdbc.PGgeometryLW;
+import net.postgis.jdbc.geometry.Geometry;
+
+import java.sql.SQLException;
+
+class PostgisGeoTypeBinder implements GeoTypeBinder {
+
+ PostgisGeoTypeBinder() {
+ }
+
+ @Override
+ public void bind(DataBinder binder, int dataType, Object data) throws SQLException {
+ if (data instanceof Geometry) {
+ binder.setObject(new PGgeometryLW((Geometry) data));
+ }
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisBase.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisBase.java
new file mode 100644
index 0000000000..8ed62a3874
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisBase.java
@@ -0,0 +1,118 @@
+package io.ebean.postgis;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import io.ebean.core.type.DataBinder;
+import io.ebean.core.type.DataReader;
+import io.ebean.core.type.DocPropertyType;
+import io.ebean.core.type.ScalarType;
+import net.postgis.jdbc.PGgeometry;
+import net.postgis.jdbc.PGgeometryLW;
+import net.postgis.jdbc.geometry.Geometry;
+import net.postgis.jdbc.geometry.GeometryBuilder;
+import net.postgis.jdbc.geometry.binary.BinaryParser;
+import org.postgresql.util.PGobject;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.sql.SQLException;
+import java.sql.Types;
+
+abstract class ScalarTypePgisBase implements ScalarType {
+
+ private final int jdbcType;
+
+ private final Class cls;
+
+ ScalarTypePgisBase(int jdbcType, Class cls) {
+ this.jdbcType = jdbcType;
+ this.cls = cls;
+ }
+
+ @Override
+ public void bind(DataBinder binder, T value) throws SQLException {
+ if (value == null) {
+ binder.setNull(Types.NULL);
+ } else {
+ binder.setObject(new PGgeometryLW(value));
+ }
+ }
+
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public T read(DataReader reader) throws SQLException {
+ Object object = reader.getObject();
+ if (object == null) {
+ return null;
+ }
+ if (object instanceof PGgeometryLW) {
+ return (T) ((PGgeometryLW) object).getGeometry();
+
+ } else if (object instanceof PGgeometry) {
+ return (T) ((PGgeometry) object).getGeometry();
+
+ } else if (object instanceof PGobject) {
+ return (T) GeometryBuilder.geomFromString(((PGobject) object).getValue(), new BinaryParser(), false);
+
+ } else {
+ throw new IllegalStateException("Could not convert from " + object.getClass() + " to " + cls);
+ }
+ }
+
+
+ @Override
+ public boolean jdbcNative() {
+ return true;
+ }
+
+ @Override
+ public int jdbcType() {
+ return jdbcType;
+ }
+
+ @Override
+ public Class type() {
+ return cls;
+ }
+
+ @Override
+ public T readData(DataInput dataInput) {
+ return null;
+ }
+
+ @Override
+ public void writeData(DataOutput dataOutput, T v) {
+
+ }
+
+ @Override
+ public Object toJdbcType(Object value) {
+ return null;
+ }
+
+ @Override
+ public T toBeanType(Object value) {
+ return null;
+ }
+
+ @Override
+ public String formatValue(T value) {
+ return value.toString();
+ }
+
+ @Override
+ public DocPropertyType docType() {
+ return null;
+ }
+
+ @Override
+ public T jsonRead(JsonParser parser) {
+ return null;
+ }
+
+ @Override
+ public void jsonWrite(JsonGenerator writer, T value) {
+
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisLineString.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisLineString.java
new file mode 100644
index 0000000000..4fa4ff2f76
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisLineString.java
@@ -0,0 +1,22 @@
+package io.ebean.postgis;
+
+import io.ebean.config.dbplatform.ExtraDbTypes;
+import net.postgis.jdbc.geometry.LineString;
+
+import java.sql.SQLException;
+
+public class ScalarTypePgisLineString extends ScalarTypePgisBase {
+
+ public ScalarTypePgisLineString() {
+ super(ExtraDbTypes.LINESTRING, LineString.class);
+ }
+
+ @Override
+ public LineString parse(String value) {
+ try {
+ return new LineString(value);
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiLineString.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiLineString.java
new file mode 100644
index 0000000000..777c6583e7
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiLineString.java
@@ -0,0 +1,22 @@
+package io.ebean.postgis;
+
+import io.ebean.config.dbplatform.ExtraDbTypes;
+import net.postgis.jdbc.geometry.MultiLineString;
+
+import java.sql.SQLException;
+
+public class ScalarTypePgisMultiLineString extends ScalarTypePgisBase {
+
+ public ScalarTypePgisMultiLineString() {
+ super(ExtraDbTypes.MULTILINESTRING, MultiLineString.class);
+ }
+
+ @Override
+ public MultiLineString parse(String value) {
+ try {
+ return new MultiLineString(value);
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPoint.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPoint.java
new file mode 100644
index 0000000000..44b6a461b8
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPoint.java
@@ -0,0 +1,22 @@
+package io.ebean.postgis;
+
+import io.ebean.config.dbplatform.ExtraDbTypes;
+import net.postgis.jdbc.geometry.MultiPoint;
+
+import java.sql.SQLException;
+
+public class ScalarTypePgisMultiPoint extends ScalarTypePgisBase {
+
+ public ScalarTypePgisMultiPoint() {
+ super(ExtraDbTypes.MULTIPOINT, MultiPoint.class);
+ }
+
+ @Override
+ public MultiPoint parse(String value) {
+ try {
+ return new MultiPoint(value);
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPolygon.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPolygon.java
new file mode 100644
index 0000000000..26b9f3970d
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisMultiPolygon.java
@@ -0,0 +1,22 @@
+package io.ebean.postgis;
+
+import io.ebean.config.dbplatform.ExtraDbTypes;
+import net.postgis.jdbc.geometry.MultiPolygon;
+
+import java.sql.SQLException;
+
+public class ScalarTypePgisMultiPolygon extends ScalarTypePgisBase {
+
+ public ScalarTypePgisMultiPolygon() {
+ super(ExtraDbTypes.MULTIPOLYGON, MultiPolygon.class);
+ }
+
+ @Override
+ public MultiPolygon parse(String value) {
+ try {
+ return new MultiPolygon(value);
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPoint.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPoint.java
new file mode 100644
index 0000000000..3f9e81b701
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPoint.java
@@ -0,0 +1,22 @@
+package io.ebean.postgis;
+
+import io.ebean.config.dbplatform.ExtraDbTypes;
+import net.postgis.jdbc.geometry.Point;
+
+import java.sql.SQLException;
+
+public class ScalarTypePgisPoint extends ScalarTypePgisBase {
+
+ public ScalarTypePgisPoint() {
+ super(ExtraDbTypes.POINT, Point.class);
+ }
+
+ @Override
+ public Point parse(String value) {
+ try {
+ return new Point(value);
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPolygon.java b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPolygon.java
new file mode 100644
index 0000000000..6727e7c0ed
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/io/ebean/postgis/ScalarTypePgisPolygon.java
@@ -0,0 +1,22 @@
+package io.ebean.postgis;
+
+import io.ebean.config.dbplatform.ExtraDbTypes;
+import net.postgis.jdbc.geometry.Polygon;
+
+import java.sql.SQLException;
+
+public class ScalarTypePgisPolygon extends ScalarTypePgisBase {
+
+ public ScalarTypePgisPolygon() {
+ super(ExtraDbTypes.POLYGON, Polygon.class);
+ }
+
+ @Override
+ public Polygon parse(String value) {
+ try {
+ return new Polygon(value);
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/ebean-net-postgis-types/src/main/java/module-info.java b/ebean-net-postgis-types/src/main/java/module-info.java
new file mode 100644
index 0000000000..9c32cec543
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/java/module-info.java
@@ -0,0 +1,17 @@
+import io.ebean.core.type.ExtraTypeFactory;
+import io.ebeaninternal.api.GeoTypeProvider;
+
+/**
+ * Provides GeoTypeProvider and ExtraTypeFactory.
+ */
+module io.ebean.postgis.types {
+
+ provides ExtraTypeFactory with io.ebean.postgis.PostgisExtraTypeFactory;
+ provides GeoTypeProvider with io.ebean.postgis.PostgisGeoTypeBindProvider;
+
+ requires io.ebean.core;
+ requires org.postgresql.jdbc;
+ requires net.postgis.jdbc;
+ requires net.postgis.jdbc.geometry;
+ requires com.fasterxml.jackson.core;
+}
diff --git a/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory
new file mode 100644
index 0000000000..54cd37d748
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebean.core.type.ExtraTypeFactory
@@ -0,0 +1 @@
+io.ebean.postgis.PostgisExtraTypeFactory
diff --git a/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebeaninternal.api.GeoTypeProvider b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebeaninternal.api.GeoTypeProvider
new file mode 100644
index 0000000000..c69d76d20d
--- /dev/null
+++ b/ebean-net-postgis-types/src/main/resources/META-INF/services/io.ebeaninternal.api.GeoTypeProvider
@@ -0,0 +1 @@
+io.ebean.postgis.PostgisGeoTypeBindProvider
\ No newline at end of file
diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/BaseEntity.java b/ebean-net-postgis-types/src/test/java/org/example/domain/BaseEntity.java
new file mode 100644
index 0000000000..6dc59d1e20
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/java/org/example/domain/BaseEntity.java
@@ -0,0 +1,20 @@
+package org.example.domain;
+
+import jakarta.persistence.Id;
+import jakarta.persistence.MappedSuperclass;
+
+@MappedSuperclass
+abstract class BaseEntity {
+
+ @Id
+ Long id;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+}
diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/CachedBean.java b/ebean-net-postgis-types/src/test/java/org/example/domain/CachedBean.java
new file mode 100644
index 0000000000..9967a7ec53
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/java/org/example/domain/CachedBean.java
@@ -0,0 +1,43 @@
+package org.example.domain;
+
+import io.ebean.annotation.Cache;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import net.postgis.jdbc.geometry.Point;
+import net.postgis.jdbc.geometry.Polygon;
+
+@Entity
+@Table(name="mybean_cached")
+@Cache
+public class CachedBean extends BaseEntity {
+ String name;
+
+ Point point;
+
+ Polygon polygon;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Point getPoint() {
+ return point;
+ }
+
+ public void setPoint(Point point) {
+ this.point = point;
+ }
+
+ public Polygon getPolygon() {
+ return polygon;
+ }
+
+ public void setPolygon(Polygon polygon) {
+ this.polygon = polygon;
+ }
+}
diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/MyBean.java b/ebean-net-postgis-types/src/test/java/org/example/domain/MyBean.java
new file mode 100644
index 0000000000..d314bc69d3
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/java/org/example/domain/MyBean.java
@@ -0,0 +1,92 @@
+package org.example.domain;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import net.postgis.jdbc.geometry.*;
+
+@Entity
+@Table(name="mybean")
+public class MyBean extends BaseEntity {
+
+ String name;
+
+ Point point;
+
+ Polygon poly;
+
+ LineString lineString;
+
+ MultiLineString multiLineString;
+
+ MultiPoint multiPoint;
+
+ MultiPolygon mpoly;
+
+ @Column(columnDefinition = "geometry(Point, 4326)", unique = true)
+ Point wgs84Point;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Point getPoint() {
+ return point;
+ }
+
+ public void setPoint(Point point) {
+ this.point = point;
+ }
+
+ public Polygon getPoly() {
+ return poly;
+ }
+
+ public void setPoly(Polygon poly) {
+ this.poly = poly;
+ }
+
+ public LineString getLineString() {
+ return lineString;
+ }
+
+ public void setLineString(LineString lineString) {
+ this.lineString = lineString;
+ }
+
+ public MultiLineString getMultiLineString() {
+ return multiLineString;
+ }
+
+ public void setMultiLineString(MultiLineString multiLineString) {
+ this.multiLineString = multiLineString;
+ }
+
+ public MultiPoint getMultiPoint() {
+ return multiPoint;
+ }
+
+ public void setMultiPoint(MultiPoint multiPoint) {
+ this.multiPoint = multiPoint;
+ }
+
+ public MultiPolygon getMpoly() {
+ return mpoly;
+ }
+
+ public void setMpoly(MultiPolygon mpoly) {
+ this.mpoly = mpoly;
+ }
+
+ public Point getWgs84Point() {
+ return wgs84Point;
+ }
+
+ public void setWgs84Point(final Point wgs84Point) {
+ this.wgs84Point = wgs84Point;
+ }
+}
diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/TestCacheSerialization.java b/ebean-net-postgis-types/src/test/java/org/example/domain/TestCacheSerialization.java
new file mode 100644
index 0000000000..4c71a174c3
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/java/org/example/domain/TestCacheSerialization.java
@@ -0,0 +1,84 @@
+package org.example.domain;
+
+import io.ebean.DB;
+import net.postgis.jdbc.geometry.Point;
+import net.postgis.jdbc.geometry.Polygon;
+import org.junit.jupiter.api.Test;
+
+import java.sql.SQLException;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class TestCacheSerialization {
+ @Test
+ public void testCache() throws SQLException {
+ Point p1=new Point(1.0, 2.0);
+ p1.setSrid(4674);
+
+ Polygon pol=new Polygon("SRID=4674;POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))");
+
+ CachedBean tb=new CachedBean();
+ tb.setId(2080L);
+ tb.setName("Serialize Test");
+ tb.setPoint(p1);
+ tb.setPolygon(pol);
+
+ DB.insert(tb);
+
+ CachedBean r1=DB.find(CachedBean.class, tb.getId());
+ assertNotNull(r1);
+ assertEquals(p1, r1.getPoint());
+ assertEquals(pol, r1.getPolygon());
+
+ CachedBean r2=DB.find(CachedBean.class, tb.getId()); // this is returned from cache
+ assertNotNull(r2);
+ assertEquals(p1, r2.getPoint()); // and did fail https://github.com/ebean-orm/ebean/issues/3026
+ assertEquals(pol, r2.getPolygon());
+
+ DB.delete(tb);
+
+ }
+
+ @Test
+ public void testNullCache() throws SQLException {
+ Point p1=new Point(1.0, 2.0);
+ p1.setSrid(4674);
+ Polygon pol=new Polygon("SRID=4674;POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))");
+
+ CachedBean tb=new CachedBean();
+ tb.setId(2081L);
+ tb.setName("Serialize Test");
+ tb.setPoint(p1);
+ tb.setPolygon(null);
+
+ DB.insert(tb);
+
+ CachedBean r1=DB.find(CachedBean.class, tb.getId());
+ assertNotNull(r1);
+ assertEquals(p1, r1.getPoint());
+ assertNull(r1.getPolygon());
+
+ CachedBean r2=DB.find(CachedBean.class, tb.getId()); // this is returned from cache
+ assertNotNull(r2);
+ assertEquals(p1, r2.getPoint()); // and did fail https://github.com/ebean-orm/ebean/issues/3026
+ assertNull(r1.getPolygon());
+
+ tb.setPoint(null);
+ tb.setPolygon(pol);
+
+ DB.save(tb);
+
+ r1=DB.find(CachedBean.class, tb.getId());
+ assertNotNull(r1);
+ assertEquals(pol, r1.getPolygon());
+ assertNull(r1.getPoint());
+
+ r2=DB.find(CachedBean.class, tb.getId()); // this is returned from cache
+ assertNotNull(r2);
+ assertEquals(pol, r2.getPolygon()); // and did fail https://github.com/ebean-orm/ebean/issues/3026
+ assertNull(r1.getPoint());
+
+ DB.delete(tb);
+
+ }
+}
diff --git a/ebean-net-postgis-types/src/test/java/org/example/domain/TestInsertQuery.java b/ebean-net-postgis-types/src/test/java/org/example/domain/TestInsertQuery.java
new file mode 100644
index 0000000000..0b33867b57
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/java/org/example/domain/TestInsertQuery.java
@@ -0,0 +1,57 @@
+package org.example.domain;
+
+import io.ebean.DB;
+import net.postgis.jdbc.geometry.*;
+import org.junit.jupiter.api.Test;
+
+import java.sql.SQLException;
+import java.util.List;
+
+public class TestInsertQuery {
+
+ /**
+ * Not automated this test yet.
+ */
+ @Test
+ public void insert() throws SQLException {
+
+
+ List list = DB.find(MyBean.class).findList();
+ for (MyBean MyBean : list) {
+ System.out.println(MyBean.getPoint());
+ }
+
+ List list1 = DB.find(MyBean.class)
+ .where()
+ .raw("st_within(st_pointfromwkb(st_point(?, ?), 4674), poly)", 1.9, 1.9)
+ .findList();
+
+ System.out.println(list1);
+
+
+ Point point = new Point("SRID=4674;POINT(2.8 1.7)");
+ Polygon poly = new Polygon("SRID=4674;POLYGON((2 2, 2 -2, -2 -2, -2 2, 2 2))");
+ LineString lineString = new LineString("SRID=4674;LINESTRING(0 0, 1 2)");
+ MultiLineString multiLineString = new MultiLineString("SRID=4674;MULTILINESTRING((0 0, 1 2), (1 2, 3 -1))");
+ MultiPoint multiPoint = new MultiPoint("SRID=4674;MULTIPOINT((2 3), (7 8))");
+ MultiPolygon mpoly = new MultiPolygon("SRID=4674;MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 3, 1 1)))");
+
+ MyBean p = new MyBean();
+ p.setName("me at "+System.currentTimeMillis());
+ p.setPoint(point);
+ p.setPoly(poly);
+ p.setLineString(lineString);
+ p.setMultiLineString(multiLineString);
+ p.setMultiPoint(multiPoint);
+ p.setMpoly(mpoly);
+
+ DB.save(p);
+
+ List content =
+ DB.find(MyBean.class)
+ .select("ST_AsText(lineString)::String")
+ .findSingleAttributeList();
+
+ System.out.println(content);
+ }
+}
diff --git a/ebean-net-postgis-types/src/test/resources/application-test.yml b/ebean-net-postgis-types/src/test/resources/application-test.yml
new file mode 100644
index 0000000000..8b04a51bff
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/resources/application-test.yml
@@ -0,0 +1,18 @@
+ebean:
+ dbSchema: mygisapp
+ geometrySRID: 4674
+
+ test:
+# useDocker: false
+# shutdown: stop # stop | remove
+ platform: netpostgis
+ ddlMode: dropCreate # none | dropCreate | create | migration | createOnly | migrationDropCreate
+ dbName: mygisapp
+
+ postgis:
+ containerName: ebeanbuild_postgis
+ port: 9432
+ image: ghcr.io/baosystems/postgis:15
+# extensions: postgis
+# url: jdbc:postgresql_lwgis://localhost:6432/mygisapp
+# driver: org.postgis.DriverWrapperLW
diff --git a/ebean-net-postgis-types/src/test/resources/logback-test.xml b/ebean-net-postgis-types/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..11ba301e03
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/resources/logback-test.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ebean-net-postgis-types/src/test/resources/notused-test-ebean.properties b/ebean-net-postgis-types/src/test/resources/notused-test-ebean.properties
new file mode 100644
index 0000000000..2319590018
--- /dev/null
+++ b/ebean-net-postgis-types/src/test/resources/notused-test-ebean.properties
@@ -0,0 +1,18 @@
+
+## when running tests
+
+ebean.ddl.generate=true
+#ebean.ddl.run=true
+#ebean.ddl.createOnly=true
+
+ebean.geometrySRID=4674
+
+datasource.default=db
+
+datasource.db.username=pgis
+datasource.db.password=pgis
+datasource.db.databaseUrl=jdbc:postgresql_lwgis://127.0.0.1:5432/pgis
+datasource.db.databaseDriver=net.postgis.jdbc.DriverWrapperLW
+
+
+
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/NetPostgisSetup.java b/ebean-test/src/main/java/io/ebean/test/config/platform/NetPostgisSetup.java
new file mode 100644
index 0000000000..6b7437413d
--- /dev/null
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/NetPostgisSetup.java
@@ -0,0 +1,56 @@
+package io.ebean.test.config.platform;
+
+import java.util.Properties;
+
+/**
+ * A variation of Postgres that expected Postgis extension support.
+ *
+ * Uses postgis/postgis image by default.
+ */
+class NetPostgisSetup implements PlatformSetup {
+
+ @Override
+ public Properties setup(Config config) {
+ int defaultPort = config.isUseDocker() ? 7432 : 5432;
+ config.setDockerPlatform("postgis");
+ config.ddlMode("dropCreate");
+ config.setDefaultPort(defaultPort);
+ config.setUsernameDefault();
+ config.setPasswordDefault();
+ config.setDriver("net.postgis.jdbc.DriverWrapperLW");
+ config.setUrl("jdbc:postgresql_lwgis://${host}:${port}/${databaseName}");
+
+ String schema = config.getSchema();
+ if (schema != null && !schema.equals(config.getUsername())) {
+ config.urlAppend("?currentSchema=" + schema);
+ }
+ config.datasourceDefaults();
+ return dockerProperties(config);
+ }
+
+ private Properties dockerProperties(Config config) {
+ if (!config.isUseDocker()) {
+ return new Properties();
+ }
+ config.setExtensions("hstore,pgcrypto,postgis");
+ config.setDockerContainerName("ut_postgis");
+ config.setDockerVersion("14-3.2");
+ return config.getDockerProperties();
+ }
+
+ @Override
+ public void setupExtraDbDataSource(Config config) {
+ int defaultPort = config.isUseDocker() ? 7432 : 5432;
+ config.setDefaultPort(defaultPort);
+ config.setExtraUsernameDefault();
+ config.setExtraDbPasswordDefault();
+ config.setExtraUrl("jdbc:postgresql_lwgis://${host}:${port}/${databaseName}");
+ config.extraDatasourceDefaults();
+ }
+
+ @Override
+ public boolean isLocal() {
+ return false;
+ }
+
+}
diff --git a/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java b/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java
index 8ef841025b..e3afc43c4e 100644
--- a/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java
+++ b/ebean-test/src/main/java/io/ebean/test/config/platform/PlatformAutoConfig.java
@@ -26,6 +26,7 @@ public class PlatformAutoConfig {
KNOWN_PLATFORMS.put("sqlite", new SqliteSetup());
KNOWN_PLATFORMS.put("postgres", new PostgresSetup());
KNOWN_PLATFORMS.put("postgis", new PostgisSetup());
+ KNOWN_PLATFORMS.put("netpostgis", new NetPostgisSetup());
KNOWN_PLATFORMS.put("nuodb", new NuoDBSetup());
KNOWN_PLATFORMS.put("mysql", new MySqlSetup());
KNOWN_PLATFORMS.put("mariadb", new MariaDBSetup());
diff --git a/pom.xml b/pom.xml
index 00f0c4e7d5..dd2bc01b24 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,6 +94,7 @@
kotlin-querybean-generator
ebean-querybean
ebean-postgis-types
+ ebean-net-postgis-types
ebean-redis
platforms
composites