And here is the Configuration file that overrides and provides the EntityManager:
package org.mycasconfig;
import com.zaxxer.hikari.HikariDataSource;
import java.time.Duration;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration("ticketRegistryConfiguration")
@EnableTransactionManagement
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class TicketRegistryConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(TicketRegistryConfiguration.class);
@Bean(name = "ticketDataSource")
public DataSource ticketDataSource(final CasConfigurationProperties casProperties) {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setSchema(casProperties.getTicket().getRegistry().getJpa().getDefaultSchema());
dataSource.setJdbcUrl(casProperties.getTicket().getRegistry().getJpa().getUrl());
dataSource.setUsername(casProperties.getTicket().getRegistry().getJpa().getUser());
dataSource.setPassword(casProperties.getTicket().getRegistry().getJpa().getPassword());
dataSource.setDriverClassName(casProperties.getTicket().getRegistry().getJpa().getDriverClass());
dataSource.setMaximumPoolSize(casProperties.getTicket().getRegistry().getJpa().getPool().getMaxSize());
dataSource.setMinimumIdle(casProperties.getTicket().getRegistry().getJpa().getPool().getMinSize());
dataSource.setMaxLifetime(Duration.parse(casProperties.getTicket().getRegistry().getJpa().getPool().getMaximumLifetime()).toMillis());
dataSource.setAutoCommit(casProperties.getTicket().getRegistry().getJpa().isAutocommit());
LOGGER.info("Ticket DataSource configured with URL: {}", dataSource.getJdbcUrl()); // Done
return dataSource;
}
@Bean(name = "ticketRegistryJpaVendorAdapter")
public HibernateJpaVendorAdapter ticketRegistryJpaVendorAdapter(final CasConfigurationProperties casProperties) {
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform(casProperties.getTicket().getRegistry().getJpa().getDialect());
adapter.setGenerateDdl(casProperties.getJdbc().isGenDdl());
adapter.setShowSql(casProperties.getJdbc().isShowSql());
LOGGER.info("TicketRegistry JpaVendorAdapter configured with dialect {}", adapter.getJpaDialect()); // Done
return adapter;
}
@Bean(name = "ticketEntityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean ticketEntityManagerFactory(Environment environment,
final CasConfigurationProperties casProperties,
@Qualifier("ticketDataSource") DataSource ticketDataSource,
@Qualifier("ticketRegistryJpaVendorAdapter") HibernateJpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(ticketDataSource);
emf.setPackagesToScan("org.apereo.cas.ticket");
emf.setJpaVendorAdapter(jpaVendorAdapter);
emf.setPersistenceUnitName("jpaTicketRegistryContext");
emf.getJpaPropertyMap().put("hibernate.dialect", casProperties.getTicket().getRegistry().getJpa().getDialect());
emf.getJpaPropertyMap().put("hibernate.hbm2ddl.auto", casProperties.getTicket().getRegistry().getJpa().getDdlAuto());
emf.getJpaPropertyMap().put("hibernate.show_sql", environment.getProperty("hibernate.show_sql", Boolean.class, false));
emf.getJpaPropertyMap().put("hibernate.format_sql", environment.getProperty("hibernate.format_sql", Boolean.class, false));
// Ensure initialization
emf.afterPropertiesSet(); // Force initialization to catch errors early
LOGGER.info("Ticket EntityManagerFactory configured with DataSource: {}", ticketDataSource); // Done
return emf;
}
@Bean(name = "ticketEntityManagerFactoryInstance")
public EntityManagerFactory ticketEntityManagerFactoryInstance(
@Qualifier("ticketEntityManagerFactory") LocalContainerEntityManagerFactoryBean emfBean) {
EntityManagerFactory emf = emfBean.getObject();
if (emf == null) {
LOGGER.error("EntityManagerFactory is null! Check DataSource and JPA configuration.");
throw new IllegalStateException("Failed to initialize EntityManagerFactory for JpaTicketRegistry");
}
LOGGER.info("ticketEntityManagerFactoryInstance successfully created: {}", emf);
return emf;
}
@Bean
public JpaTransactionManager transactionManager(
@Qualifier("ticketEntityManagerFactoryInstance") EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
LOGGER.info("TransactionManager configured with EntityManagerFactory: {}", entityManagerFactory);
return transactionManager;
}
}