Cayenne 4.2 new types demo
diff --git a/cayenne-jdbc-type-other/README.md b/cayenne-jdbc-type-other/README.md
new file mode 100644
index 0000000..0fd98b8
--- /dev/null
+++ b/cayenne-jdbc-type-other/README.md
@@ -0,0 +1 @@
+== Cayenne Example
\ No newline at end of file
diff --git a/cayenne-jdbc-type-other/pom.xml b/cayenne-jdbc-type-other/pom.xml
new file mode 100644
index 0000000..6a8d0db
--- /dev/null
+++ b/cayenne-jdbc-type-other/pom.xml
@@ -0,0 +1,122 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>cayenne-jdbc-type-other</artifactId>
+ <groupId>org.apache.cayenne.demo</groupId>
+ <version>1.0-SNAPSHOT</version>
+
+ <properties>
+ <maven.compiler.source>8</maven.compiler.source>
+ <maven.compiler.target>8</maven.compiler.target>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+ <bootique.version>2.0.M1</bootique.version>
+ <cayenne.version>4.2.M2-SNAPSHOT</cayenne.version>
+
+ <postgres.jdbc.version>9.4.1209</postgres.jdbc.version>
+ <mysql.jdbc.version>8.0.21</mysql.jdbc.version>
+ <slf4j.version>1.7.30</slf4j.version>
+
+ <main.class>org.apache.cayenne.demo.Application</main.class>
+
+ <compiler.plugin.version>3.8.1</compiler.plugin.version>
+ <jar.plugin.version>3.2.0</jar.plugin.version>
+ <surefire.plugin.version>2.22.2</surefire.plugin.version>
+ <failsafe.plugin.version>2.22.2</failsafe.plugin.version>
+ </properties>
+
+ <repositories>
+ <repository>
+ <id>apache.snapshots</id>
+ <name>Apache Snapshot Repository</name>
+ <url>https://repository.apache.org/snapshots</url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>io.bootique.bom</groupId>
+ <artifactId>bootique-bom</artifactId>
+ <version>${bootique.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <!-- compile dependencies -->
+ <dependency>
+ <groupId>io.bootique</groupId>
+ <artifactId>bootique</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.bootique.cayenne</groupId>
+ <artifactId>bootique-cayenne42</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.bootique.jdbc</groupId>
+ <artifactId>bootique-jdbc-hikaricp</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.cayenne</groupId>
+ <artifactId>cayenne-server</artifactId>
+ <version>${cayenne.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>${postgres.jdbc.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <version>${mysql.jdbc.version}</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.cayenne.plugins</groupId>
+ <artifactId>cayenne-modeler-maven-plugin</artifactId>
+ <version>${cayenne.version}</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>${jar.plugin.version}</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>${compiler.plugin.version}</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${surefire.plugin.version}</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>${failsafe.plugin.version}</version>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/Application.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/Application.java
new file mode 100644
index 0000000..318e840
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/Application.java
@@ -0,0 +1,36 @@
+package org.apache.cayenne.demo;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.bootique.BQCoreModule;
+import io.bootique.BQModuleProvider;
+import io.bootique.Bootique;
+import io.bootique.cayenne.v42.CayenneModule;
+import io.bootique.di.BQModule;
+import io.bootique.di.BaseBQModule;
+import org.apache.cayenne.configuration.server.ServerModule;
+import org.apache.cayenne.demo.model.types.JsonValueType;
+
+public class Application extends BaseBQModule implements BQModuleProvider {
+
+ public static void main(String[] args) {
+ Bootique.app(args)
+ .args("--config=classpath:config.yml", "-g")
+ .module(b -> BQCoreModule.extend(b)
+ .addCommand(GeoTestCommand.class)
+ .addCommand(JsonTestCommand.class)
+ )
+ .module(b -> CayenneModule.extend(b)
+ .addModule(binder -> binder.bind(ObjectMapper.class).toProviderInstance(ObjectMapper::new))
+ .addModule(binder -> ServerModule.contributeValueObjectTypes(binder).add(JsonValueType.class))
+ )
+ .autoLoadModules()
+ .exec()
+ .exit();
+ }
+
+ @Override
+ public BQModule module() {
+ return new Application();
+ }
+
+}
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/GeoTestCommand.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/GeoTestCommand.java
new file mode 100644
index 0000000..af11120
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/GeoTestCommand.java
@@ -0,0 +1,43 @@
+package org.apache.cayenne.demo;
+
+import javax.inject.Inject;
+import javax.inject.Provider;
+
+import io.bootique.cli.Cli;
+import io.bootique.command.CommandOutcome;
+import io.bootique.command.CommandWithMetadata;
+import io.bootique.meta.application.CommandMetadata;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.demo.model.TestGeo;
+import org.apache.cayenne.query.ObjectSelect;
+import org.apache.cayenne.query.SQLExec;
+import org.apache.cayenne.value.Wkt;
+
+public class GeoTestCommand extends CommandWithMetadata {
+
+ @Inject
+ Provider<ServerRuntime> serverRuntimeProvider;
+
+ public GeoTestCommand() {
+ super(CommandMetadata.builder(GeoTestCommand.class).build());
+ }
+
+ @Override
+ public CommandOutcome run(Cli cli) {
+ ServerRuntime serverRuntime = serverRuntimeProvider.get();
+ ObjectContext context = serverRuntime.newContext();
+
+ SQLExec.query("DELETE FROM test_geo").execute(context);
+
+ TestGeo testGeo = context.newObject(TestGeo.class);
+ testGeo.setArea(new Wkt("POLYGON ((30 10, 40 40, 20 40, 40 50, 30 10))"));
+ context.commitChanges();
+
+ ObjectSelect.query(TestGeo.class).select(context)
+ .forEach(geo -> System.out.println(geo.getArea().getWkt()));
+
+ return CommandOutcome.succeeded();
+ }
+
+}
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/JsonTestCommand.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/JsonTestCommand.java
new file mode 100644
index 0000000..3a009fc
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/JsonTestCommand.java
@@ -0,0 +1,74 @@
+package org.apache.cayenne.demo;
+
+import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Provider;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import io.bootique.cli.Cli;
+import io.bootique.command.CommandOutcome;
+import io.bootique.command.CommandWithMetadata;
+import io.bootique.meta.application.CommandMetadata;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.demo.model.TestJson;
+import org.apache.cayenne.query.ObjectSelect;
+import org.apache.cayenne.query.SQLExec;
+
+class JsonTestCommand extends CommandWithMetadata {
+
+ @Inject
+ Provider<ServerRuntime> serverRuntimeProvider;
+
+ @Inject
+ ObjectMapper objectMapper;
+
+ public JsonTestCommand() {
+ super(CommandMetadata.builder(JsonTestCommand.class).build());
+ }
+
+ @Override
+ public CommandOutcome run(Cli cli) {
+
+ ServerRuntime serverRuntime = serverRuntimeProvider.get();
+ ObjectContext context = serverRuntime.newContext();
+ SQLExec.query("DELETE FROM test_json").execute(context);
+
+ createJsonObject(context);
+
+ listKeys(context);
+
+ getKey(context);
+
+ return CommandOutcome.succeeded();
+ }
+
+ private void createJsonObject(ObjectContext context) {
+ TestJson testJson = context.newObject(TestJson.class);
+ ObjectNode objectNode = new ObjectNode(objectMapper.getNodeFactory());
+ objectNode.put("test", 123);
+ objectNode.put("field1", "abc");
+ objectNode.put("field2", false);
+ testJson.setJson(objectNode);
+ context.commitChanges();
+ }
+
+ private void listKeys(ObjectContext context) {
+ List<String> keys = ObjectSelect.query(TestJson.class)
+ .column(TestJson.JSON.function("json_object_keys", String.class))
+ .select(context);
+
+ System.out.println("JSON keys: ");
+ keys.forEach(k -> System.out.println("\t" + k));
+ }
+
+ private void getKey(ObjectContext context) {
+ List<Integer> testValues = ObjectSelect.query(TestJson.class)
+ .column(TestJson.JSON.operator("->", Integer.class, "test"))
+ .select(context);
+
+ System.out.println("JSON values for path 'test':");
+ testValues.forEach(v -> System.out.println("\t" + v));
+ }
+}
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/TestGeo.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/TestGeo.java
new file mode 100644
index 0000000..5015111
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/TestGeo.java
@@ -0,0 +1,9 @@
+package org.apache.cayenne.demo.model;
+
+import org.apache.cayenne.demo.model.auto._TestGeo;
+
+public class TestGeo extends _TestGeo {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/TestJson.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/TestJson.java
new file mode 100644
index 0000000..d556efe
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/TestJson.java
@@ -0,0 +1,9 @@
+package org.apache.cayenne.demo.model;
+
+import org.apache.cayenne.demo.model.auto._TestJson;
+
+public class TestJson extends _TestJson {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/auto/_TestGeo.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/auto/_TestGeo.java
new file mode 100644
index 0000000..a2b2b49
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/auto/_TestGeo.java
@@ -0,0 +1,111 @@
+package org.apache.cayenne.demo.model.auto;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.time.LocalDateTime;
+
+import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.value.Wkt;
+import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.DateProperty;
+import org.apache.cayenne.exp.property.NumericIdProperty;
+import org.apache.cayenne.exp.property.PropertyFactory;
+
+/**
+ * Class _TestGeo was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _TestGeo extends BaseDataObject {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final NumericIdProperty<Integer> ID_PK_PROPERTY = PropertyFactory.createNumericId("id", "TestGeo", Integer.class);
+ public static final String ID_PK_COLUMN = "id";
+
+ public static final BaseProperty<Wkt> AREA = PropertyFactory.createBase("area", Wkt.class);
+ public static final DateProperty<LocalDateTime> DATE = PropertyFactory.createDate("date", LocalDateTime.class);
+
+ protected Wkt area;
+ protected LocalDateTime date;
+
+
+ public void setArea(Wkt area) {
+ beforePropertyWrite("area", this.area, area);
+ this.area = area;
+ }
+
+ public Wkt getArea() {
+ beforePropertyRead("area");
+ return this.area;
+ }
+
+ public void setDate(LocalDateTime date) {
+ beforePropertyWrite("date", this.date, date);
+ this.date = date;
+ }
+
+ public LocalDateTime getDate() {
+ beforePropertyRead("date");
+ return this.date;
+ }
+
+ @Override
+ public Object readPropertyDirectly(String propName) {
+ if(propName == null) {
+ throw new IllegalArgumentException();
+ }
+
+ switch(propName) {
+ case "area":
+ return this.area;
+ case "date":
+ return this.date;
+ default:
+ return super.readPropertyDirectly(propName);
+ }
+ }
+
+ @Override
+ public void writePropertyDirectly(String propName, Object val) {
+ if(propName == null) {
+ throw new IllegalArgumentException();
+ }
+
+ switch (propName) {
+ case "area":
+ this.area = (Wkt)val;
+ break;
+ case "date":
+ this.date = (LocalDateTime)val;
+ break;
+ default:
+ super.writePropertyDirectly(propName, val);
+ }
+ }
+
+ private void writeObject(ObjectOutputStream out) throws IOException {
+ writeSerialized(out);
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ readSerialized(in);
+ }
+
+ @Override
+ protected void writeState(ObjectOutputStream out) throws IOException {
+ super.writeState(out);
+ out.writeObject(this.area);
+ out.writeObject(this.date);
+ }
+
+ @Override
+ protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ super.readState(in);
+ this.area = (Wkt)in.readObject();
+ this.date = (LocalDateTime)in.readObject();
+ }
+
+}
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/auto/_TestJson.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/auto/_TestJson.java
new file mode 100644
index 0000000..e6838a3
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/auto/_TestJson.java
@@ -0,0 +1,111 @@
+package org.apache.cayenne.demo.model.auto;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.BaseProperty;
+import org.apache.cayenne.exp.property.NumericIdProperty;
+import org.apache.cayenne.exp.property.PropertyFactory;
+import org.apache.cayenne.exp.property.StringProperty;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * Class _TestJson was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _TestJson extends BaseDataObject {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final NumericIdProperty<Integer> ID_PK_PROPERTY = PropertyFactory.createNumericId("id", "TestJson", Integer.class);
+ public static final String ID_PK_COLUMN = "id";
+
+ public static final BaseProperty<ObjectNode> JSON = PropertyFactory.createBase("json", ObjectNode.class);
+ public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
+
+ protected ObjectNode json;
+ protected String name;
+
+
+ public void setJson(ObjectNode json) {
+ beforePropertyWrite("json", this.json, json);
+ this.json = json;
+ }
+
+ public ObjectNode getJson() {
+ beforePropertyRead("json");
+ return this.json;
+ }
+
+ public void setName(String name) {
+ beforePropertyWrite("name", this.name, name);
+ this.name = name;
+ }
+
+ public String getName() {
+ beforePropertyRead("name");
+ return this.name;
+ }
+
+ @Override
+ public Object readPropertyDirectly(String propName) {
+ if(propName == null) {
+ throw new IllegalArgumentException();
+ }
+
+ switch(propName) {
+ case "json":
+ return this.json;
+ case "name":
+ return this.name;
+ default:
+ return super.readPropertyDirectly(propName);
+ }
+ }
+
+ @Override
+ public void writePropertyDirectly(String propName, Object val) {
+ if(propName == null) {
+ throw new IllegalArgumentException();
+ }
+
+ switch (propName) {
+ case "json":
+ this.json = (ObjectNode)val;
+ break;
+ case "name":
+ this.name = (String)val;
+ break;
+ default:
+ super.writePropertyDirectly(propName, val);
+ }
+ }
+
+ private void writeObject(ObjectOutputStream out) throws IOException {
+ writeSerialized(out);
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ readSerialized(in);
+ }
+
+ @Override
+ protected void writeState(ObjectOutputStream out) throws IOException {
+ super.writeState(out);
+ out.writeObject(this.json);
+ out.writeObject(this.name);
+ }
+
+ @Override
+ protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ super.readState(in);
+ this.json = (ObjectNode)in.readObject();
+ this.name = (String)in.readObject();
+ }
+
+}
diff --git a/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/types/JsonValueType.java b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/types/JsonValueType.java
new file mode 100644
index 0000000..2005783
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/java/org/apache/cayenne/demo/model/types/JsonValueType.java
@@ -0,0 +1,43 @@
+package org.apache.cayenne.demo.model.types;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.types.ValueObjectType;
+import org.apache.cayenne.value.Json;
+import org.apache.cayenne.di.Inject;
+
+public class JsonValueType implements ValueObjectType<ObjectNode, Json> {
+
+ @Inject
+ ObjectMapper objectMapper;
+
+ @Override
+ public Class<Json> getTargetType() {
+ return Json.class;
+ }
+
+ @Override
+ public Class<ObjectNode> getValueType() {
+ return ObjectNode.class;
+ }
+
+ @Override
+ public ObjectNode toJavaObject(Json value) {
+ try {
+ return (ObjectNode) objectMapper.readTree(value.getRawJson());
+ } catch (Exception e) {
+ throw new CayenneRuntimeException("Unable to parse JSON", e);
+ }
+ }
+
+ @Override
+ public Json fromJavaObject(ObjectNode object) {
+ return new Json(object.toString());
+ }
+
+ @Override
+ public String toCacheKey(ObjectNode object) {
+ return object.toString();
+ }
+}
diff --git a/cayenne-jdbc-type-other/src/main/resources/META-INF/services/io.bootique.BQModuleProvider b/cayenne-jdbc-type-other/src/main/resources/META-INF/services/io.bootique.BQModuleProvider
new file mode 100644
index 0000000..4a2d644
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/resources/META-INF/services/io.bootique.BQModuleProvider
@@ -0,0 +1 @@
+org.apache.cayenne.demo.Application
diff --git a/cayenne-jdbc-type-other/src/main/resources/cayenne-demo.xml b/cayenne-jdbc-type-other/src/main/resources/cayenne-demo.xml
new file mode 100644
index 0000000..723f184
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/resources/cayenne-demo.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domain xmlns="http://cayenne.apache.org/schema/10/domain"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain https://cayenne.apache.org/schema/10/domain.xsd"
+ project-version="10">
+ <map name="demo"/>
+</domain>
diff --git a/cayenne-jdbc-type-other/src/main/resources/config.yml b/cayenne-jdbc-type-other/src/main/resources/config.yml
new file mode 100644
index 0000000..0c0418f
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/resources/config.yml
@@ -0,0 +1,16 @@
+jdbc:
+ geo:
+ jdbcUrl: jdbc:postgresql://localhost:5432/cayenne-postgis
+ username: cayenne
+ password: cayenne
+ mysql:
+ jdbcUrl: jdbc:mysql://localhost:3306/cayenne-mysql?useUnicode=true&characterEncoding=UTF-8&generateSimpleParameterMetadata=true&allowPublicKeyRetrieval=true&useSSL=false
+ username: cayenne
+ password: cayenne
+
+cayenne:
+ datasource: geo
+ createSchema: false
+ maps:
+ - location: classpath:demo.map.xml
+ name: map1
\ No newline at end of file
diff --git a/cayenne-jdbc-type-other/src/main/resources/demo.map.xml b/cayenne-jdbc-type-other/src/main/resources/demo.map.xml
new file mode 100644
index 0000000..5143ec9
--- /dev/null
+++ b/cayenne-jdbc-type-other/src/main/resources/demo.map.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap https://cayenne.apache.org/schema/10/modelMap.xsd"
+ project-version="10">
+ <property name="defaultPackage" value="org.apache.cayenne.demo.model"/>
+ <property name="defaultSchema" value="public"/>
+ <db-entity name="test_geo">
+ <db-attribute name="area" type="OTHER" isMandatory="true" length="2147483647"/>
+ <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isGenerated="true" isMandatory="true" length="10"/>
+ </db-entity>
+ <db-entity name="test_json">
+ <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isGenerated="true" isMandatory="true" length="10"/>
+ <db-attribute name="json" type="OTHER" isMandatory="true" length="2147483647"/>
+ <db-attribute name="name" type="VARCHAR" length="255"/>
+ </db-entity>
+ <obj-entity name="TestGeo" className="org.apache.cayenne.demo.model.TestGeo" dbEntityName="test_geo">
+ <obj-attribute name="area" type="org.apache.cayenne.value.Wkt" db-attribute-path="area"/>
+ </obj-entity>
+ <obj-entity name="TestJson" className="org.apache.cayenne.demo.model.TestJson" dbEntityName="test_json">
+ <obj-attribute name="json" type="com.fasterxml.jackson.databind.node.ObjectNode" db-attribute-path="json"/>
+ <obj-attribute name="name" type="java.lang.String" db-attribute-path="name"/>
+ </obj-entity>
+ <dbImport xmlns="http://cayenne.apache.org/schema/10/dbimport">
+ <schema>
+ <includeTable>
+ <name>test_geo</name>
+ </includeTable>
+ <includeTable>
+ <name>test_json</name>
+ </includeTable>
+ <name>public</name>
+ </schema>
+ <tableTypes>
+ <tableType>TABLE</tableType>
+ <tableType>VIEW</tableType>
+ </tableTypes>
+ <forceDataMapCatalog>false</forceDataMapCatalog>
+ <forceDataMapSchema>false</forceDataMapSchema>
+ <namingStrategy>org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator</namingStrategy>
+ <skipPrimaryKeyLoading>false</skipPrimaryKeyLoading>
+ <skipRelationshipsLoading>false</skipRelationshipsLoading>
+ <useJava7Types>false</useJava7Types>
+ <usePrimitives>true</usePrimitives>
+ </dbImport>
+ <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
+ <destDir>..\java</destDir>
+ <mode>entity</mode>
+ <template>templates/v4_1/subclass.vm</template>
+ <superTemplate>templates/v4_1/superclass.vm</superTemplate>
+ <outputPattern>*.java</outputPattern>
+ <makePairs>true</makePairs>
+ <usePkgPath>true</usePkgPath>
+ <overwrite>false</overwrite>
+ <createPropertyNames>false</createPropertyNames>
+ <createPKProperties>true</createPKProperties>
+ <client>false</client>
+ </cgen>
+</data-map>