package org.jpwh.env;
import org.hibernate.internal.util.StringHelper;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.HashMap;
import java.util.Map;
/**
* Creates an EntityManagerFactory.
*
* Configuration of the persistence units is taken from META-INF/persistence.xml
* and other sources. Additional hbm.xml
file names can be given to the
* constructor.
*
*/
public class JPASetup {
protected final String persistenceUnitName;
protected final Map properties = new HashMap<>();
protected final EntityManagerFactory entityManagerFactory;
public JPASetup(DatabaseProduct databaseProduct,
String persistenceUnitName,
String... hbmResources) throws Exception {
this.persistenceUnitName = persistenceUnitName;
// No automatic scanning by Hibernate, all persistence units list explicit classes/packages
properties.put(
"hibernate.archive.autodetection",
"none"
);
// Really the only way how we can get hbm.xml files into an explicit persistence
// unit (where Hibernate scanning is disabled)
properties.put(
"hibernate.hbmxml.files",
StringHelper.join(",", hbmResources != null ? hbmResources : new String[0])
);
// We don't want to repeat these settings for all units in persistence.xml, so
// they are set here programmatically
properties.put(
"hibernate.format_sql",
"true"
);
properties.put(
"hibernate.use_sql_comments",
"true"
);
// Select database SQL dialect
properties.put(
"hibernate.dialect",
databaseProduct.hibernateDialect
);
entityManagerFactory =
Persistence.createEntityManagerFactory(getPersistenceUnitName(), properties);
}
public String getPersistenceUnitName() {
return persistenceUnitName;
}
public EntityManagerFactory getEntityManagerFactory() {
return entityManagerFactory;
}
public EntityManager createEntityManager() {
return getEntityManagerFactory().createEntityManager();
}
public void createSchema() {
generateSchema("create");
}
public void dropSchema() {
generateSchema("drop");
}
public void generateSchema(String action) {
// Take exiting EMF properties, override the schema generation setting on a copy
Map createSchemaProperties = new HashMap<>(properties);
createSchemaProperties.put(
"javax.persistence.schema-generation.database.action",
action
);
Persistence.generateSchema(getPersistenceUnitName(), createSchemaProperties);
}
}