jpa-schema-gradle-plugin
Gradle plugin for generate schema or DDL scripts from JPA entities using JPA 2.1 schema generator. for Maven, see Maven Plugin.
Currently support EclipseLink (Reference Implementation) and Hibernate.
Before Announce...
READ MY LIP; JPA DDL GENERATOR IS NOT SILVER BULLET
Sometimes (most times exactly :P) JPA will generate weird scripts so you SHOULD modify them properly.
Version History
See Releases for more informations...
6.x (in progress...)
- Required JDK 8 or above.
- Required Gradle 6.0 or above. (for support Java 13 or above)
4.x
0.3.6
- Required Gradle 4.10 or above. (for support spring-boot plugin version 2.0+)
0.3
- Required Gradle 4.0 or above.
- Java 9 support.
- Required JDK 8 or above.
- No more output.resourcesDir = output.classesDirneeded.
- No more buildscriptdependencies needed.
- Dropped support DataNucleus, it was my mistake.
- Required Gradle 6.0 or above. (for support Java 13)
Reworking on 0.3
- Minimized spring dependency, only include spring-orm,spring-context,spring-aspectsand its dependencies. (based on spring 5.x)
- Direct including any JPA implementation is removed, remains JUST API.
- Will improve test with each major release version of each JPA providers.
- Re-implemented with Kotlin, on my self-training.
If you have discussions, please make issue. discussions are always welcome.
How-to Use
plugins {
  id 'io.github.divinespear.jpa-schema-generate' version '0.3.6'
}
generateSchema {
  // default options
  // see SchemaGenerationConfig to all options
  ...
  // if you want multiple output
  targets {
    targetName {
      // same as default options
      ...
    }
  }
} 
To generate schema, run
gradle generateSchema
or
./gradlew generateSchema
see also test cases Generate*Spec.groovy, as examples.
without persistence.xml
 
You MUST specify two options: vendor and packageToScan.
generateSchema {
  vendor = 'hibernate' // 'eclipselink', 'hibernate', or 'hibernate+spring'.
                       // you can use class name too. (like 'org.hibernate.jpa.HibernatePersistenceProvider')
  packageToScan = [ 'your.package.to.scan', ... ]
  ...
} 
Plugin only dependencies
Since 0.3.4, you can add dependencies for plugin with configuration generateSchema.
// no need to add 'generateSchema' into configurations block.
dependencies {
  ...
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  // only need to load java.time converter from spring-data-jpa on schema generation
  generateSchema 'org.threeten:threetenbp:1.3.6'
}
generateSchema {
  ...  
  packageToScan = [
    // load java.time converter from spring-data-jpa
    'org.springframework.data.jpa.convert.threeten',
    'your.package.to.scan',
    ...
  ]
  ...
} 
Provider specific
EclipseLink
- EclipseLink 2.5 on Java 9 without persistence.xmlwill not work.
- EclipseLink 2.6 on Java 12 or higher will not work. embedded ASM library cannot read class files.
- EclipseLink's Oracle{8,9,10,11}Platformuses some type classes from Oracle's JDBC driver. you should have it in your dependency.
Hibernate
-  After 5.2, just use hibernate-coreinsteadhibernate-entitymanager, it is merged.
-  Naming strategy property is - 4.x: hibernate.ejb.naming_strategy
- 5.x: hibernate.physical_naming_strategy/hibernate.implicit_naming_strategy
 
- 4.x: 
-  For select dialect, do one of - set hibernate.dialectonproperties
- set databaseProductName,databaseMajorVersion, and/ordatabaseMinorVersionfor determine dialect.
 
- set 
Hibernate with Spring ORM
- vendorshould be- hibernate+spring. (without- persistence.xml)
- use io.spring.dependency-managementfor version management.- You can change hibernate version with hibernate.versionproperty.
 
- You can change hibernate version with 
SchemaGenerationConfig
Here is full list of parameters of generateSchema.
| name | type | description | 
|---|---|---|
| skip | boolean | skip schema generation default value is  | 
| format | boolean | generate as formatted default value is  | 
| scanTestClasses | boolean | scan test classes default value is  | 
| persistenceXml | string | location of persistence.xmlfileNote: Hibernate DOES NOT SUPPORT custom location. ( default value is  | 
| persistenceUnitName | string | unit name of persistence.xmldefault value is  | 
| databaseAction | string | schema generation action for database support value is one of 
 default value is  | 
| scriptAction | string | schema generation action for script support value is one of 
 default value is  | 
| outputDirectory | file | output directory for generated ddl scripts REQUIRED for  default value is  | 
| createOutputFileName | string | generated create script name REQUIRED for  default value is  | 
| dropOutputFileName | string | generated drop script name REQUIRED for  default value is  | 
| createSourceMode | string | specifies whether the creation of database artifacts is to occur on the basis of the object/relational mappingmetadata, DDL script, or a combination of the two. support value is one of 
 default value is  | 
| createSourceFile | string | create source file path. REQUIRED for  | 
| dropSourceMode | string | specifies whether the dropping of database artifacts is to occur on the basis of the object/relational mappingmetadata, DDL script, or a combination of the two. support value is one of 
 default value is  | 
| dropSourceFile | file | drop source file path. REQUIRED for  | 
| jdbcDriver | string | jdbc driver class name default is declared class name in persistence xml. and Remember,  | 
| jdbcUrl | string | jdbc connection url default is declared connection url in persistence xml. | 
| jdbcUser | string | jdbc connection username default is declared username in persistence xml. | 
| jdbcPassword | string | jdbc connection password default is declared password in persistence xml. If your account has no password (especially local file-base, like Apache Derby, H2, etc...), it can be omitted. | 
| databaseProductName | string | database product name for emulate database connection. this should useful for script-only action. 
 | 
| databaseMajorVersion | int | database major version for emulate database connection. this should useful for script-only action. 
 | 
| databaseMinorVersion | int | database minor version for emulate database connection. this should useful for script-only action. 
 | 
| lineSeparator | string | line separator for generated schema file. support value is one of  default value is system property  | 
| properties | java.util.Map | JPA vendor specific properties. | 
| vendor | string | JPA vendor name or class name of vendor's PersistenceProviderimplemention.vendor name is one of 
 REQUIRED for project without  | 
| packageToScan | java.util.List | list of package name for scan entity classes REQUIRED for project without  | 
How-to config library specific properties
 
It's just groovy map, so you can config like this:
generateSchema {
  ...
  // global properties
  properties = [
    'hibernate.dialect': 'org.hibernate.dialect.MySQL5InnoDBDialect',
    ...
  ]
  // you can set target-specific too.
  ...
} 
Database Product Names
It's about databaseProductName property. If not listed below, will work as basic standard SQL.
for EclipseLink
databaseMajorVersion and databaseMinorVersion is not required.
- Oracle12= Oracle 12c
- Oracle11= Oracle 11g
- Oracle10= Oracle 10g
- Oracle9= Oracle 9i
- Oracle= Oracle with default compatibility
- Microsoft SQL Server
- DB2
- MySQL
- PostgreSQL
- SQL Anywhere
- Sybase SQL Server
- Adaptive Server Enterprise= Sybase
- Pointbase
- Informix Dynamic Server
- Firebird
- ingres
- Apache Derby
- H2
- HSQL Database Engine
for Hibernate
For other versions, select tag to your version.
License
Source Copyright © 2013-2018 Sin Young "Divinespear" Kang (divinespear at gmail dot com). Distributed under the Apache License, Version 2.0.
 JarCasting
 JarCasting