Я использую LocalContainerEntityManagerFactoryBean
для настройки JPA EntityManagerFactory
.Среди отсканированных объектов, которые я сканирую с помощью setPackagesToScan
, у меня есть объект User, который реализует интерфейс безопасности Spring UserDetails
.
Когда я запускаю свое приложение, у меня появляется эта ошибка:
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [com.medkhelifi.model.entities.User]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:354)
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:105)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:156)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:150)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1821)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1758)
... 11 more
Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.medkhelifi.model.entities.User
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:342)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:351)
... 23 more
ThisВот как я настроил свое приложение: ** Конфигурация Beans: **
@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan("com.medkhrlifi.tutorials.designpatterns.dao")
@EnableTransactionManagement
public class AppConfig {
// properties variable goes here ...
@Bean
public DataSource dataSource(){
// datasource config goes here ...
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean lem = new LocalContainerEntityManagerFactoryBean();
lem.setDataSource(dataSource());
lem.setJpaVendorAdapter(vendorAdapter);
lem.setPackagesToScan("com.medkhelifi.model.entities");
lem.setJpaProperties(jpaProperties());
//lem.afterPropertiesSet();
return lem;
}
@Bean
public PlatformTransactionManager platformTransactionManager(){
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
return txManager;
}
@Bean
public Properties jpaProperties(){
Properties jpa = new Properties();
jpa.put("hibernate.dialect", dialect);
return jpa;
}
}
Пользовательская сущность
@Data
@Entity
@Table(name = "user")
public class User implements UserDetails {
private static final Logger logger = LoggerFactory.getLogger(User.class);
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
@NotEmpty
private String firstname;
@NotEmpty
private String lastname;
@NotEmpty
private String email;
@NotEmpty
private String password;
//@ElementCollection(fetch = FetchType.EAGER)
//@Builder.Default
@DBRef
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "id_user"),
inverseJoinColumns = @JoinColumn(name = "id_role"))
private List<Role> roles = new ArrayList<>();
// Override methods goes here
}
** ОБНОВЛЕНИЕ ** Я знаю, что ошибкапришел из реализации интерфейса UserDetails, потому что, если я удаляю его, мое приложение запускается нормально, но это не то, что я хочу.
Вот как я запускаю свое приложение (только для целей тестирования):
public class DaoApp {
private static AnnotationConfigApplicationContext applicationContext= new AnnotationConfigApplicationContext (AppConfig.class);
public static void main(String[] args) throws ParseException {
System.out.println("main app for test purpose only started successfully");
}
}
Я надеюсь, что предоставил достаточно информации, чтобы помочь.