Spring Data JPA无法识别Card实体类的问题求助
问题:Card类无法被识别为JPA托管实体
我完全无法自行解决这个问题,希望能得到帮助。我的Card类无法被识别为实体,出现如下错误:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cardRepository' defined in ua.com.alevel.persistence.repository.card.CardRepository defined in @EnableJpaRepositories declared on HibernateConfig: Not a managed type: class ua.com.alevel.persistence.entity.Card at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1417) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1337) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:888) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-6.0.11.jar:6.0.11] ... 38 common frames omitted Caused by: java.lang.IllegalArgumentException: Not a managed type: class ua.com.alevel.persistence.entity.Card at org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.managedType(JpaMetamodelImpl.java:192) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final] at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.managedType(MappingMetamodelImpl.java:467) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final] at org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl.managedType(MappingMetamodelImpl.java:97) ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final] at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:80) ~[spring-data-jpa-3.1.2.jar:3.1.2] at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:69) ~[spring-data-jpa-3.1.2.jar:3.1.2] at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:246) ~[spring-data-jpa-3.1.2.jar:3.1.2] at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:211) ~[spring-data-jpa-3.1.2.jar:3.1.2] at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:194) ~[spring-data-jpa-3.1.2.jar:3.1.2] at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:81) ~[spring-data-jpa-3.1.2.jar:3.1.2] at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:317) ~[spring-data-commons-3.1.2.jar:3.1.2] at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:279) ~[spring-data-commons-3.1.2.jar:3.1.2] at org.springframework.data.util.Lazy.getNullable(Lazy.java:245) ~[spring-data-commons-3.1.2.jar:3.1.2] at org.springframework.data.util.Lazy.get(Lazy.java:114) ~[spring-data-commons-3.1.2.jar:3.1.2] at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:285) ~[spring-data-commons-3.1.2.jar:3.1.2] at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:132) ~[spring-data-jpa-3.1.2.jar:3.1.2] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1817) ~[spring-beans-6.0.11.jar:6.0.11] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1766) ~[spring-beans-6.0.11.jar:6.0.11]
将该类移至其他项目、使用相同配置时一切正常,但在当前项目中却无法运行。
相关代码
BaseEntity抽象类(Card和User继承自该类)
package ua.com.alevel.persistence.entity; import javax.persistence.*; import java.util.Date; @MappedSuperclass public abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Temporal(TemporalType.TIMESTAMP) private Date created; @Temporal(TemporalType.TIMESTAMP) private Date updated; private boolean visible; public BaseEntity() { this.created = new Date(); this.updated = new Date(); this.visible = true; } @PreUpdate public void onPreUpdate() { this.updated = new Date(); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Date getCreated() { return created; } public void setCreated(Date created) { this.created = created; } public Date getUpdated() { return updated; } public void setUpdated(Date updated) { this.updated = updated; } public boolean getVisible() { return visible; } public void setVisible(boolean visible) { this.visible = visible; } }
Card类
package ua.com.alevel.persistence.entity; import javax.persistence.*; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; @Entity @Table(name = "cards") public class Card extends BaseEntity { @Column(name = "card_number") private String number; @Temporal(TemporalType.TIMESTAMP) private Date validUntil; @Column(name = "card_cvv") private String cvv; @ManyToOne @JoinColumn(name = "card_owner_id", nullable = false) private User owner; @Column(name = "card_balance") private BigDecimal balance; public Card() { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, 4); validUntil = calendar.getTime(); balance = BigDecimal.valueOf(0); } public Card(String number, Date validUntil, String cvv, BigDecimal balance) { this.number = number; this.validUntil = validUntil; this.cvv = cvv; this.balance = balance; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Date getValidUntil() { return validUntil; } public void setValidUntil(Date validUntil) { this.validUntil = validUntil; } public String getCvv() { return cvv; } public void setCvv(String cvv) { this.cvv = cvv; } public User getOwner() { return owner; } public void setOwner(User owner) { this.owner = owner; } public BigDecimal getBalance() { return balance; } public void setBalance(BigDecimal balance) { this.balance = balance; } }
Hibernate配置类
package ua.com.alevel.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.hibernate5.HibernateTransactionManager; import org.springframework.orm.hibernate5.LocalSessionFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; import java.io.IOException; import java.util.Properties; @Configuration @EnableTransactionManagement @EnableJpaRepositories("ua.com.alevel.persistence.repository") public class HibernateConfig { @Value("${spring.datasource.url}") private String jdbcUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driver-class-name}") private String driver; @Value("${spring.jpa.properties.hibernate.dialect}") private String dialect; @Value("${spring.jpa.hibernate.ddl-auto}") private String hbm2ddl; @Value("${spring.jpa.show-sql}") private Boolean showSql; @Value("${spring.jpa.properties.hibernate.jdbc.max_size}") private String maxSize; @Value("${spring.jpa.properties.hibernate.jdbc.min_size}") private String minSize; @Value("${spring.jpa.properties.hibernate.jdbc.batch_size}") private String batchSize; @Value("${spring.jpa.properties.hibernate.jdbc.fetch_size}") private String fetchSize; @Value("${spring.jpa.properties.hibernate.enable_lazy_load_no_trans}") private String lazyLoad; private static final String HIBERNATE_DIALECT = "hibernate.dialect"; private static final String HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto"; private static final String HIBERNATE_SHOW_SQL = "hibernate.show_sql"; private static final String HIBERNATE_ENABLE_LAZY_LOAD_NO_TRANS = "hibernate.enable_lazy_load_no_trans"; private static final String MAX_SIZE = "hibernate.c3p0.max_size"; private static final String MIN_SIZE = "hibernate.c3p0.min_size"; private static final String BATCH_SIZE = "hibernate.jdbc.batch_size"; private static final String FETCH_SIZE = "hibernate.jdbc.fetch_size"; private static final String ENTITY_MANAGER_PACKAGES_TO_SCAN = "ua.com.alevel.persistence.entity"; @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(jdbcUrl); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } @Bean(name = "entityManagerFactory") public LocalSessionFactoryBean sessionFactoryBean() { LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource()); sessionFactoryBean.setPackagesToScan(ENTITY_MANAGER_PACKAGES_TO_SCAN); sessionFactoryBean.setHibernateProperties(hibernateProperties()); try { sessionFactoryBean.afterPropertiesSet(); } catch (IOException e) { e.printStackTrace(); } return sessionFactoryBean; } @Bean public HibernateTransactionManager transactionManager() { HibernateTransactionManager manager = new HibernateTransactionManager(); manager.setSessionFactory(sessionFactoryBean().getObject()); return manager; } private Properties hibernateProperties() { Properties properties = new Properties(); properties.put(HIBERNATE_DIALECT, dialect); properties.put(HIBERNATE_HBM2DDL_AUTO, hbm2ddl); properties.put(HIBERNATE_SHOW_SQL, showSql); properties.put(HIBERNATE_ENABLE_LAZY_LOAD_NO_TRANS, lazyLoad); properties.put(MAX_SIZE, maxSize); properties.put(MIN_SIZE, minSize); properties.put(BATCH_SIZE, batchSize); properties.put(FETCH_SIZE, fetchSize); return properties; } }
项目主类
package ua.com.alevel; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) public class FinancesMicroservicesApplication { public static void main(String[] args) { SpringApplication.run(FinancesMicroservicesApplication.class, args); } }
项目架构

解决方案
核心问题分析
当前配置混用了Spring Data JPA和原生Hibernate的配置方式,导致Spring Data JPA无法识别JPA实体类:
- 用
@EnableJpaRepositories启用了Spring Data JPA,但配置的是Hibernate原生的LocalSessionFactoryBean和HibernateTransactionManager,而非Spring Data JPA对应的JPA标准组件。 - Spring Data JPA需要通过
EntityManagerFactory扫描实体类,当前配置未正确关联JPA实体扫描逻辑。
修复步骤
- 修改Hibernate配置类,替换为JPA标准配置
将Hibernate原生组件替换为Spring Data JPA兼容的JPA组件,确保实体类能被正确扫描:package ua.com.alevel.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.DriverManagerDataSource; 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.sql.DataSource; import java.util.Properties; @Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "ua.com.alevel.persistence.repository", entityManagerFactoryRef = "entityManagerFactory") public class HibernateConfig { @Value("${spring.datasource.url}") private String jdbcUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driver-class-name}") private String driver; @Value("${spring.jpa.properties.hibernate.dialect}") private String dialect; @Value("${spring.jpa.hibernate.ddl-auto}") private String hbm2ddl; @Value("${spring.jpa.show-sql}") private Boolean showSql; @Value("${spring
相关产品推荐
相关产品推荐

