Spring boot - 不是托管类型

use*_*872 100 spring jpa spring-mvc spring-data spring-boot

我使用Spring boot + JPA并在启动服务时遇到问题.

Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.nervytech.dialer.domain.PhoneSettings
    at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:219)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:145)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:89)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:69)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:177)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
Run Code Online (Sandbox Code Playgroud)

这是Application.java文件,

@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
@SpringBootApplication
public class DialerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DialerApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用UCp进行连接池,DataSource配置如下,

@Configuration
@ComponentScan
@EnableTransactionManagement
@EnableAutoConfiguration
@EnableJpaRepositories(entityManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = { "com.nervy.dialer.spring.jpa.repository" })
public class ApplicationDataSource {

    /** The Constant LOGGER. */
    private static final Logger LOGGER = LoggerFactory
            .getLogger(ApplicationDataSource.class);

    /** The Constant TEST_SQL. */
    private static final String TEST_SQL = "select 1 from dual";

    /** The pooled data source. */
    private PoolDataSource pooledDataSource;
Run Code Online (Sandbox Code Playgroud)

UserDetailsS​​ervice实现,

@Service("userDetailsService")
@SessionAttributes("user")
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;
Run Code Online (Sandbox Code Playgroud)

服务层实现,

@Service
public class PhoneSettingsServiceImpl implements PhoneSettingsService {

}
Run Code Online (Sandbox Code Playgroud)

存储库类,

@Repository
public interface PhoneSettingsRepository extends JpaRepository<PhoneSettings, Long> {

}
Run Code Online (Sandbox Code Playgroud)

实体类,

@Entity
@Table(name = "phone_settings", catalog = "dialer")
public class PhoneSettings implements java.io.Serializable {
Run Code Online (Sandbox Code Playgroud)

WebSecurityConfig类,

@Configuration
@EnableWebMvcSecurity
@ComponentScan
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    /**
     * Instantiates a new web security config.
     */
    public WebSecurityConfig() {

        super();
    }

    /**
     * {@inheritDoc}
     * @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
            .antMatchers("/login", "/logoffUser", "/sessionExpired", "/error", "/unauth", "/redirect", "*support*").permitAll()
            .anyRequest().authenticated().and().rememberMe().and().httpBasic()
            .and()
            .csrf()
            .disable().logout().deleteCookies("JSESSIONID").logoutSuccessUrl("/logoff").invalidateHttpSession(true);
    }


    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {

      auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

}
Run Code Online (Sandbox Code Playgroud)

包裹如下,

1) Application class is in - com.nervy.dialer
2) Datasource class is in - com.nervy.dialer.common
3) Entity classes are in - com.nervy.dialer.domain
4) Service classes are in - com.nervy.dialer.domain.service.impl
5) Controllers are in - com.nervy.dialer.spring.controller
6) Repository classes are in - com.nervy.dialer.spring.jpa.repository
7) WebSecurityConfig is in - com.nervy.dialer.spring.security
Run Code Online (Sandbox Code Playgroud)

谢谢

Man*_*ari 95

在Spring Boot入口点类中使用@EntityScan配置实体的位置.

2016年9月更新:对于Spring Boot 1.4+:
使用org.springframework.boot.autoconfigure.domain.EntityScan
而不是org.springframework.boot.orm.jpa.EntityScan,因为... boot.orm.jpa.EntityScan 从Spring Boot 1.4 开始被弃用

  • 此选项也无济于事。我想,我的配置中缺少其他内容。 (2认同)
  • 对我的情况也没有帮助。 (2认同)

Dee*_*pak 77

jpa entity is not a managed type

如果在最新版本的 Sp 中遇到问题,根本原因是:

在最新版本的 Springboot 和 JDK 中,此错误是由于 Java EE 中使用的“Javax”命名空间被替换为 Jakarta EE 中的“Jakarta”命名空间造成的。

使固定

因此,在较新版本的Spring版本和JDK中。例如 Spring 6+ 和 JDK 17+,您现在需要替换javax.persistence.Entitywhen 来jakarta.persistence.Entity解决 jpa entity is not a managed type错误

进一步的背景

@SakshamGupta。根本原因是:

2017年,Oracle(收购了Java EE)决定将Java EE的所有权、维护和未来开发转移给Eclipse基金会。这次转移促成了 Jakarta EE 的创建。

作为此转变的一部分,包命名约定也发生了变化。Java EE 中使用的“Javax”命名空间已替换为 Jakarta EE 中的“Jakarta”命名空间。

因此,较新版本的 Java 和 Spring Boot 采用了 JDK17 和 Spring Boot v3 中的 Jakarta EE。因此,您需要切换到jakarta.persistence.Entity. 此更改反映了从 Java EE 到 Jakarta EE 的转变以及更新的包命名约定。

这是附加材料:

  • 这对我来说很有效,因为我的代码基于以前版本的 SpringBoot 3.xx 的代码,我非常感谢这个答案,谢谢! (4认同)
  • 对于任何偶然发现这一点的人。如果您遵循 SpringBoot 教程并最终出现此错误,javax 持久化库已经是 jakarta 持久化,这将解决该问题。我对java很陌生,所以这让我措手不及。 (3认同)

man*_*noj 66

尝试添加以下所有内容,在我的应用程序中,它与tomcat一起正常工作

 @EnableJpaRepositories("my.package.base.*")
 @ComponentScan(basePackages = { "my.package.base.*" })
 @EntityScan("my.package.base.*")   
Run Code Online (Sandbox Code Playgroud)

我使用的春天开机,而当我使用嵌入的Tomcat,它正在罚款了 @EntityScan("my.package.base.*"),但是当我试图将应用程序部署到外部的Tomcat我得到了not a managed type错误我的实体.

  • 同上!为了让上述内容适用于我正在做的 POC,我只需将所有这些添加到我的 Spring Boot 应用程序注释中,并使用“com.*”作为匹配器 - 这似乎可以轻松解决我的情况我的类来自 2 个不同的“com.*”命名空间!`@EnableJpaRepositories("com.*") @ComponentScan(basePackages = { "com.*" }) @EntityScan("com.*")` (3认同)

azi*_*sal 46

我想更换@ComponentScan@ComponentScan("com.nervy.dialer.domain")意志的工作.

编辑:

我添加了一个示例应用程序来演示如何使用BoneCP设置池数据源连接.

该应用程序与您的结构相同.我希望这可以帮助您解决配置问题


Far*_*jmi 23

在我的情况下,问题是由于我忘记用@ javax.persistence.Entity注释注释我的实体类.卫生署!

//The class reported as "not a amanaged type"
@javax.persistence.Entity
public class MyEntityClass extends my.base.EntityClass {
    ....
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*rvo 20

我收到这个错误是因为我愚蠢地写了

公共接口 FooBarRepository 扩展 CrudRepository<FooBar Repository , Long> { ...

简要说明:通常会创建一个 FooBarRepository 类来管理 FooBar 对象(通常表示一个名为 foo_bar 之类的表中的数据。)当扩展 CrudRepository 以创建专门的存储库类时,需要指定正在管理的类型——在在这种情况下,FooBar。然而,我错误地输入的是 FooBarRepository 而不是 FooBar。FooBarRepository 不是我试图用 FooBarRepository 管理的类型(类)。因此,编译器会发出此错误。

我用粗体突出显示了错误的输入。删除我的示例中突出显示的单词 Repository 并编译代码。

  • 我生命中无法恢复的15分钟 (7认同)
  • 你是个天才!:) 节省了我的时间。 (2认同)

Nit*_*ena 16

您可以使用@EntityScan注释并提供实体包以扫描所有jpa实体.您可以在已使用@SpringBootApplication批注的基础应用程序类上使用此批注.

例如 @EntityScan("com.test.springboot.demo.entity")


Laz*_*uss 13

如果您已从另一个项目复制粘贴了持久性配置,则必须在EntityManagerFactory中手动设置包:

    @Bean
    public EntityManagerFactory entityManagerFactory() throws PropertyVetoException {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setPackagesToScan("!!!!!!misspelled.package.path.to.entities!!!!!");

        ....
    }
Run Code Online (Sandbox Code Playgroud)


小智 12

把它放在你的Application.java文件中

@ComponentScan(basePackages={"com.nervy.dialer"})
@EntityScan(basePackages="domain")
Run Code Online (Sandbox Code Playgroud)


小智 9

永远不要忘记在域类上添加@Entity


And*_*che 8

多模块 Maven 项目

我知道@EntityScan之前已经回答过:

但我觉得我需要强调的是,在处理多模块 Maven 项目时,这个问题可能经常发生

就我而言,我有一个多模块 Maven 项目,其中一个模块是model包,其他模块是microservices. 就我而言,当我运行一个使用model package(在我的项目中调用的)中定义的类的微服务时,我必须将@EntityScan(basePackages = {"com.example.domain"})注释添加到@SpringBootApplication class

@SpringBootApplication
@EnableEurekaClient
@EntityScan(basePackages = {"com.example.domain"}) // add this so the spring boot context knows where to look for entities
public class DoctorServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(DoctorServiceApplication.class, args);
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 6

我已将我的应用程序类移至父包,例如:

主类:com.job.application

实体:com.job.application.entity

这样你就不必添加@EntityScan


小智 5

您或者在类定义中缺少@Entity,或者您具有显式的组件扫描路径,并且该路径不包含您的类


小智 5

就我而言,我错误地使用存储库类而不是实体类作为 JpaRepository 参数。像这样:

@Repository
public interface BuyerInspectionRepository extends JpaRepository<BuyerInspectionRepository,Long> {

}
Run Code Online (Sandbox Code Playgroud)

所以我用实体类替换了存储库类。这就是买方检验。

@Repository
public interface BuyerInspectionRepository extends JpaRepository<BuyerInspection,Long> {

}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

187250 次

最近记录:

6 年 前