import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.NamingStrategy;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaExport.Type;
import org.hibernate.tool.hbm2ddl.Target;
public final static String USERNAME = "hibernate.connection.username";
public final static String PASSWORD = "hibernate.connection.password";
public final static String DIALECT = "hibernate.dialect";
+ public final static String NAMING_STRATEGY="hibernate.ejb.naming_strategy";
private final static String MD5S = "schema.md5s";
/**
* The maven project.
+ * <p>
+ * Only needed internally.
*
- * @parameter expression="${project}"
+ * @parameter property="project"
* @required
* @readonly
*/
/**
* Build-directory.
+ * <p>
+ * Only needed internally.
*
- * @parameter expression="${project.build.directory}"
+ * @parameter property="project.build.directory"
+ * @required
+ * @readonly
*/
private String buildDirectory;
* This parameter defaults to the maven build-output-directory for classes.
* Additonally, all dependencies are scanned for annotated classes.
*
- * @parameter expression="${project.build.outputDirectory}"
+ * @parameter property="project.build.outputDirectory"
*/
private String outputDirectory;
* If this parameter is set to <code>true</code> the test-classes of the
* artifact will be scanned for hibernate-annotated classes additionally.
*
- * @parameter expression="${hibernate.export.scann_testclasses}" default-value="false"
+ * @parameter property="hibernate.export.scan_testclasses" default-value="false"
*/
private boolean scanTestClasses;
* This parameter is only used, when <code>scanTestClasses</code> is set
* to <code>true</code>!
*
- * @parameter expression="${project.build.testOutputDirectory}"
+ * @parameter property="project.build.testOutputDirectory"
*/
private String testOutputDirectory;
/**
* Skip execution
+ * <p>
+ * If set to <code>true</code>, the execution is skipped.
+ * <p>
+ * A skipped excecution is signaled via the maven-property
+ * <code>${hibernate.export.skipped}</code>.
+ * <p>
+ * The excecution is skipped automatically, if no modified or newly added
+ * annotated classes are found and the dialect was not changed.
*
- * @parameter expression="${maven.test.skip}" default-value="false"
+ * @parameter property="maven.test.skip" default-value="false"
*/
private boolean skip;
* Force execution
* <p>
* Force execution, even if no modified or newly added annotated classes
- * where found. <code>skip</code> takes precedence over <code>force</code>.
+ * where found and the dialect was not changed.
+ * <p>
+ * <code>skip</code> takes precedence over <code>force</code>.
*
- * @parameter expression="${hibernate.export.force}" default-value="false"
+ * @parameter property="hibernate.export.force" default-value="false"
*/
private boolean force;
/**
* SQL-Driver name.
*
- * @parameter expression="${hibernate.connection.driver_class}
+ * @parameter property="hibernate.connection.driver_class"
*/
private String driverClassName;
/**
* Database URL.
*
- * @parameter expression="${hibernate.connection.url}"
+ * @parameter property="hibernate.connection.url"
*/
private String url;
/**
* Database username
*
- * @parameter expression="${hibernate.connection.username}"
+ * @parameter property="hibernate.connection.username"
*/
private String username;
/**
* Database password
*
- * @parameter expression="${hibernate.connection.password}"
+ * @parameter property="hibernate.connection.password"
*/
private String password;
/**
* Hibernate dialect.
*
- * @parameter expression="${hibernate.dialect}"
+ * @parameter property="hibernate.dialect"
*/
private String hibernateDialect;
+ /**
+ * Hibernate Naming Strategy
+ * @parameter property="hibernate.ejb.naming_strategy"
+ * @author nicus
+ */
+ private String hibernateNamingStrategy;
+
/**
* Path to Hibernate configuration file.
*
/**
* Target of execution:
* <ul>
- * <li><strong>NONE</strong> do nothing - just validate the configuration</li>
- * <li><strong>EXPORT</strong> create database <strong>(DEFAULT!)</strong></li>
+ * <li><strong>NONE</strong> do nothing - just validate the configuration (forces excecution, signals skip)</li>
+ * <li><strong>EXPORT</strong> create database (<strong>DEFAULT!</strong>. forces excecution, signals skip)</li>
* <li><strong>SCRIPT</strong> export schema to SQL-script</li>
* <li><strong>BOTH</strong></li>
* </ul>
- * @parameter expression="${hibernate.export.target}" default-value="EXPORT"
+ *
+ * @parameter property="hibernate.export.target" default-value="EXPORT"
*/
private String target;
/**
- * Type of export.
+ * Type of execution.
* <ul>
* <li><strong>NONE</strong> do nothing - just validate the configuration</li>
* <li><strong>CREATE</strong> create database-schema</li>
* <li><strong>DROP</strong> drop database-schema</li>
- * <li><strong>BOTH</strong> <strong>(DEFAULT!)</strong></li>
+ * <li><strong>BOTH</strong> (<strong>DEFAULT!</strong>)</li>
* </ul>
- * @parameter expression="${hibernate.export.type}" default-value="BOTH"
+ *
+ * @parameter property="hibernate.export.type" default-value="BOTH"
*/
private String type;
/**
* Output file.
*
- * @parameter expression="${hibernate.export.schema.filename}" default-value="${project.build.directory}/schema.sql"
+ * @parameter property="hibernate.export.schema.filename" default-value="${project.build.directory}/schema.sql"
*/
private String outputFile;
/**
* Delimiter in output-file.
*
- * @parameter expression="${hibernate.export.schema.delimiter}" default-value=";"
+ * @parameter property="hibernate.export.schema.delimiter" default-value=";"
*/
private String delimiter;
/**
* Format output-file.
*
- * @parameter expression="${hibernate.export.schema.format}" default-value="true"
+ * @parameter property="hibernate.export.schema.format" default-value="true"
*/
private boolean format;
getLog().debug(
"Overwriting property " +
PASSWORD + "=" + properties.getProperty(PASSWORD) +
- " with the value " + password
+ " with the value " + password
);
else
getLog().debug("Using the value " + password);
getLog().debug("Using the value " + hibernateDialect);
properties.setProperty(DIALECT, hibernateDialect);
}
+ if ( hibernateNamingStrategy != null )
+ {
+ if ( properties.contains(NAMING_STRATEGY))
+ getLog().debug(
+ "Overwriting property " +
+ NAMING_STRATEGY + "=" + properties.getProperty(NAMING_STRATEGY) +
+ " with the value " + hibernateNamingStrategy
+ );
+ else
+ getLog().debug("Using the value " + hibernateNamingStrategy);
+ properties.setProperty(NAMING_STRATEGY, hibernateNamingStrategy);
+ }
/** The generated SQL varies with the dialect! */
if (md5s.containsKey(DIALECT))
Configuration config = new Configuration();
config.setProperties(properties);
+
+ if ( properties.containsKey(NAMING_STRATEGY))
+ {
+ String namingStrategy = properties.getProperty(NAMING_STRATEGY);
+ getLog().debug("Explicitly set NamingStrategy: " + namingStrategy);
+ try
+ {
+ @SuppressWarnings("unchecked")
+ Class<NamingStrategy> namingStrategyClass = (Class<NamingStrategy>) Class.forName(namingStrategy);
+ config.setNamingStrategy(namingStrategyClass.newInstance());
+ }
+ catch (Exception e)
+ {
+ getLog().error("Error setting NamingStrategy", e);
+ throw new MojoExecutionException(e.getMessage());
+ }
+ }
+
getLog().debug("Adding annotated classes to hibernate-mapping-configuration...");
for (Class<?> annotatedClass : classes)
{