Search code examples
javaspringhibernatespring-mvcmultipart

Get SessionFactory on Java based configured Spring App


I need to upload an image to a database (not sure yet if is a good idea to do this or upload the file and reference it from the database) and I've defined a form and a controller to do that. The problem is that I need to convert the MultipartFile to a Blob object and for that I need to use Hibernate.getLobCreator who needs a Session object.

This is the first time using Java based config and I have the next class to define the persistence context:

@Configuration
@EnableJpaRepositories(basePackages = {
        "com.davidmogar.alsa"
})
@EnableTransactionManagement
public class PersistenceContext {

    private static final String[] ENTITY_PACKAGES = {
            "com.davidmogar.alsa.domain"
    };

    private static final String PROPERTY_NAME_DB_DRIVER_CLASS = "db.driver";
    private static final String PROPERTY_NAME_DB_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DB_URL = "db.url";
    private static final String PROPERTY_NAME_DB_USER = "db.username";
    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
    private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
    private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY =     "hibernate.ejb.naming_strategy";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";

    @Bean(destroyMethod = "close")
    DataSource dataSource(Environment environment) {
        HikariConfig dataSourceConfig = new HikariConfig();
              dataSourceConfig.setDriverClassName(environment.getRequiredProperty(PROPERTY_NAME_DB_DRIVER_CLASS));
        dataSourceConfig.setJdbcUrl(environment.getRequiredProperty(PROPERTY_NAME_DB_URL));
        dataSourceConfig.setUsername(environment.getRequiredProperty(PROPERTY_NAME_DB_USER));
        dataSourceConfig.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DB_PASSWORD));

        return new HikariDataSource(dataSourceConfig);
    }

    @Bean(name = "entityManagerFactory")
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource, Environment environment) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManagerFactoryBean.setPackagesToScan(ENTITY_PACKAGES);

        Properties jpaProperties = new Properties();

        jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty
                (PROPERTY_NAME_HIBERNATE_DIALECT));

        jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, environment.getRequiredProperty
                (PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));

        jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty
                (PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));

        jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty
                (PROPERTY_NAME_HIBERNATE_SHOW_SQL));

        jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty
                (PROPERTY_NAME_HIBERNATE_FORMAT_SQL));

        entityManagerFactoryBean.setJpaProperties(jpaProperties);

        return entityManagerFactoryBean;
    }

    @Bean
    JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);

        return transactionManager;
    }

}

How can I get the Session in the controller to convert the MultipartFile?


Solution

  • You can get an instance of Hibernate Session via EntityManager.

    @Autowired
    private EntityManagerFactory emf;
    
    public void foo(){
    EntityManager em = emf.createEntityManager();
    Session session = em.unwrap(Session.class);
    LobCreator lob = getLobCreator(session);
    ...
    }