diff --git a/src/generators/index.js b/src/generators/index.js
index 019affd..961b30a 100644
--- a/src/generators/index.js
+++ b/src/generators/index.js
@@ -22,6 +22,13 @@ module.exports = {
description: "Java Event Models for Axon.",
attributes: [],
invocation: require('./java-axon-events-generator')
- }
+ },
+ nclazz_java_jpa_entites: {
+ key: "nclazz_jpa_entities",
+ name: "Java JPA Entities",
+ description: "Java JPA/Hibernate Entities.",
+ attributes: [],
+ invocation: require('./java-jpa-entities.generator')
+ },
}
\ No newline at end of file
diff --git a/src/generators/java-jpa-entities.generator.js b/src/generators/java-jpa-entities.generator.js
new file mode 100644
index 0000000..865ce3f
--- /dev/null
+++ b/src/generators/java-jpa-entities.generator.js
@@ -0,0 +1,28 @@
+const Mustache = require('mustache')
+const fs = require('fs')
+const path = require('path')
+
+const jpaEntites = require('../java-jpa-entity');
+
+const templateEntities = fs.readFileSync(path.resolve(path.join('templates', 'jpa-entity.java.mustache')), 'utf-8')
+
+module.exports = (service) => {
+
+ const jpaModels = service.models.filter(model => model.attributes.find(attr => attr.name == 'jpa_sql'))
+ const models = jpaEntites.mapJavaJpaEntity(jpaModels, service.namespace)
+
+ const modelFiles = models.map(model => {
+ return {
+ name: `${model.name}.java`,
+ dir: model.dir,
+ contents: Mustache.render(templateModel, { service, ...model })
+ }
+ })
+ return [
+ ...modelFiles,
+ ...enumFiles,
+ ...unionFiles
+ ]
+
+
+}
\ No newline at end of file
diff --git a/src/java-jpa-entity.js b/src/java-jpa-entity.js
new file mode 100644
index 0000000..79a77f8
--- /dev/null
+++ b/src/java-jpa-entity.js
@@ -0,0 +1,35 @@
+const utils = require('./utils')
+const javaType = require('./java-type')
+
+module.exports = {
+ mapJavaJpaEntity: (models, namespace, suffix='models') => {
+ return models.map(model => {
+
+ let jpa = model.attributes.find(attr => attr.name == 'jpa_sql');
+
+ model.name = utils.pascalcase(model.name)
+ model.package = `${namespace}.${suffix}`;
+ model.dir = model.package.replace(/\./g, '/')
+ model.fields = model.fields.map(field => {
+ field.name = utils.camelcase(field.name)
+ field.type = javaType.mapJavaType(field.type, namespace)
+ field.default = javaType.mapDefaultValue(field.type, field.default)
+ return field
+ })
+
+ let imports = []
+ for(let field of model.fields) {
+ imports = [ ...imports, ...field.type.imports ]
+ }
+ model.imports = [ ...new Set(imports) ]
+ model.implements = model.implements || []
+ if(model.implements.length) {
+ model['implements'][ model['implements'].length - 1 ].last = true
+ }
+
+ model.table = jpa.table || model.plural
+
+ return model
+ })
+ }
+}
\ No newline at end of file
diff --git a/templates/jpa-entity.java.mustache b/templates/jpa-entity.java.mustache
new file mode 100644
index 0000000..417bdeb
--- /dev/null
+++ b/templates/jpa-entity.java.mustache
@@ -0,0 +1,32 @@
+/**
+ * Auto-generated from apibuilder.io service specification.
+ * apidoc-version : {{service.apidoc.version}}
+ * organisation : {{service.organization.key}}
+ * service-version : {{service.version}}
+ *
+ * Documentation at:
+ * https://app.apibuilder.io/{{service.organization.key}}/{{service.name}}/{{service.version}}
+ *
+**/
+package {{package}};
+
+import javax.persistence.*;
+{{#imports}}
+import {{{.}}};
+{{/imports}}
+
+/**
+ * {{description}}
+ * See https://app.apibuilder.io/{{service.organization.key}}/{{service.name}}/{{service.version}}#model-{{model.name}}
+ *
+**/
+@Entity
+@Data
+@Table(
+ name = "{{table}}"
+)
+public class {{name}}Entity {
+
+
+
+}
\ No newline at end of file