BaseJpaDBConfig.java

package sk.iway.iwcm.system.spring;

import java.util.Properties;

import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.config.TargetDatabase;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.DBPool;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.system.jpa.WebJETJavaSECMPInitializer;
import sk.iway.iwcm.system.jpa.WebJETPersistenceProvider;

/**
 * Base class for Spring DATA config, you need to extend this class and override entityManagerFactory() and transactionManager() methods
 * http://docs.webjetcms.sk/latest/en/custom-apps/spring-config/
 */

public class BaseJpaDBConfig {

    /**
     * In your implementation you need to override this method and annotate it with @Bean("basecmsTransactionManager")
     * @return
     */
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

    /**
     * In your implementation you need to override this method and annotate it with @Bean("basecmsEntityManager")
     * @param packagesToScan
     * @return
     */
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        return getEntityManager(null, null);
    }

    /**
     * Base class to setup JPA EntityManager
     * @param datasource
     * @param packagesToScan
     * @return
     */
    public LocalContainerEntityManagerFactoryBean getEntityManager(String datasource, String[] packagesToScan) {
        Logger.println(this, "Loading JpaDBConfig");

        if (datasource == null) datasource = "iwcm";

        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setPersistenceProvider(new WebJETPersistenceProvider());
        emf.setDataSource(DBPool.getInstance().getDataSource(datasource));
        emf.setJpaVendorAdapter(new EclipseLinkJpaVendorAdapter());

        // Zoznam packages ktore sa maju skenovat pre databazove entity/DAO !!
        emf.setPackagesToScan(packagesToScan);

        Properties properties = new Properties();
        // https://stackoverflow.com/questions/10769051/eclipselinkjpavendoradapter-instead-of-hibernatejpavendoradapter-issue
        properties.setProperty("eclipselink.weaving", "false");
        properties.setProperty("eclipselink.session.customizer", "sk.iway.webjet.v9.JpaSessionCustomizer");

        if (Constants.DB_TYPE == Constants.DB_ORACLE) properties.setProperty(PersistenceUnitProperties.TARGET_DATABASE, TargetDatabase.Oracle);
        else if (Constants.DB_TYPE == Constants.DB_MSSQL) properties.setProperty(PersistenceUnitProperties.TARGET_DATABASE, TargetDatabase.SQLServer);
        else if (Constants.DB_TYPE == Constants.DB_PGSQL) properties.setProperty(PersistenceUnitProperties.TARGET_DATABASE, TargetDatabase.PostgreSQL);
        else properties.setProperty(PersistenceUnitProperties.TARGET_DATABASE, TargetDatabase.MySQL);

        WebJETJavaSECMPInitializer.setDefaultProperties(properties);
        emf.setJpaProperties(properties);

        return emf;
    }

}