不是托管类型

gdx19jrr  于 2021-06-29  发布在  Java
关注(0)|答案(17)|浏览(453)

我使用springboot+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)

这是application.java文件,

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

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

我使用ucp连接池,数据源配置如下,

@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;

userdetailsservice实现,

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

    @Autowired
    private UserService userService;

服务层实现,

@Service
public class PhoneSettingsServiceImpl implements PhoneSettingsService {

}

存储库类,

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

}

实体类,

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

WebSecurity配置类,

@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());
    }

}

Package 如下:, Application 班级在-
com.nervy.dialer Datasource 班级在- com.nervy.dialer.common 实体类位于- com.nervy.dialer.domain 服务类别在- com.nervy.dialer.domain.service.impl 控制器处于- com.nervy.dialer.spring.controller 存储库类位于-
com.nervy.dialer.spring.jpa.repository WebSecurityConfig 在- com.nervy.dialer.spring.security 谢谢

vltsax25

vltsax251#

您可以使用@entityscan注解并提供实体包来扫描所有jpa实体。您可以在使用@springbootapplication注解的基础应用程序类上使用此注解。
e、 g.@entityscan(“com.test.springboot.demo.entity”)

7z5jn7bk

7z5jn7bk2#

从springboot1.3.x迁移到1.5时遇到了一些问题,在entitymanagerfactorybean中更新了实体包之后,它就可以工作了

@Bean(name="entityManagerFactoryDef")
  @Primary
  public LocalContainerEntityManagerFactoryBean defaultEntityManager() {
      Map map = new HashMap();
      map.put("hibernate.default_schema", env.getProperty("spring.datasource.username"));
      map.put("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
      LocalContainerEntityManagerFactoryBean em = createEntityManagerFactoryBuilder(jpaVendorProperties())
              .dataSource(primaryDataSource()).persistenceUnit("default").properties(map).build();
      em.setPackagesToScan("com.simple.entity");
      em.afterPropertiesSet();
      return em;
  }

这个bean在应用程序类中引用如下

@SpringBootApplication
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryDef")
public class SimpleApp {

}
dgtucam1

dgtucam13#

我已将我的应用程序类移动到父包,如:
主类:com.job.application
实体:com.job.application.entity
这样您就不必添加@entityscan

neekobn8

neekobn84#

别忘了在域类中添加@entity

lb3vh1jj

lb3vh1jj5#

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

m1m5dgzv

m1m5dgzv6#

把这个放进你的口袋里 Application.java 文件

@ComponentScan(basePackages={"com.nervy.dialer"})
@EntityScan(basePackages="domain")
pw136qt2

pw136qt27#

我想更换 @ComponentScan@ComponentScan("com.nervy.dialer.domain") 会有用的。
编辑:
我添加了一个示例应用程序来演示如何使用bonecp设置池数据源连接。
应用程序的结构与您的相同。我希望这将帮助您解决配置问题

xzlaal3s

xzlaal3s8#

如果配置了自己的entitymanagerfactory bean,或者从另一个项目复制粘贴了这样的持久性配置,则必须在entitymanagerfactory的配置中设置或调整包:

@Bean
public EntityManagerFactory entityManagerFactory() throws PropertyVetoException {
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);
    LocalContainerEntityManagerFactoryBean factory;
    factory = new LocalContainerEntityManagerFactoryBean();
    factory.setPackagesToScan("!!!!!!package.path.to.entities!!!!!");
    //...
}
xfyts7mz

xfyts7mz9#

在我的例子中,问题是由于我忘记用 @javax.persistence.Entity 注解。哦!

//The class reported as "not a amanaged type"
@javax.persistence.Entity
public class MyEntityClass extends my.base.EntityClass {
    ....
}
1sbrub3j

1sbrub3j10#

我也有同样的问题,在版本springbootv1.3.x中,我所做的是将springboot升级到版本1.5.7.release。然后问题就消失了。

jyztefdp

jyztefdp11#

我使用的是SpringBoot2.0,我将@componentscan替换为 @EntityScan

qqrboqgw

qqrboqgw12#

我有同样的问题,但只有在运行spring启动测试时才需要jpa。最终的结果是我们自己的jpa测试配置初始化了entitymanagerfactory并将包设置为扫描。如果您手动设置entityscan参数,这显然会覆盖它。

final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter( vendorAdapter );
    factory.setPackagesToScan( Project.class.getPackage().getName());
    factory.setDataSource( dataSource );

重要的是要注意:如果你仍然卡在你应该设置一个断点在 org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManagersetPackagesToScan() 方法并查看在何处调用它以及向它传递了哪些包。

pdkcd3nj

pdkcd3nj13#

我犯这个错误是因为我写得很蠢
公共接口foobarepository扩展了crudepository<foobarrepository,long>{。。。
简要说明:通常创建一个foobarepository类来管理foobar对象(通常在一个名为foo_bar的表中表示数据)。当扩展crudepository来创建专门的存储库类时,需要指定要管理的类型——在本例中是foobar。不过,我打错的是foobarepository而不是foobar。foobarepository不是我试图用foobarepository管理的类型(类)。因此,编译器会发出此错误。
我强调了粗体字的错误之处。删除我的示例中突出显示的word存储库,代码就会编译。

z9zf31ra

z9zf31ra14#

我遇到这个问题是因为我没有Maporm.xml文件中的所有实体

k97glaaz

k97glaaz15#

尝试添加以下所有内容,在我的应用程序中,它与tomcat配合得很好

@EnableJpaRepositories("my.package.base.*")
 @ComponentScan(basePackages = { "my.package.base.*" })
 @EntityScan("my.package.base.*")

我使用的是springboot,当我使用嵌入式tomcat时,它可以正常工作 @EntityScan("my.package.base.*") 但当我试图将应用程序部署到外部tomcat时 not a managed type 我的实体出错。

相关问题