代码之家  ›  专栏  ›  技术社区  ›  Pavanraotk

Spring-AWS(无Spring boot):java。lang.IllegalArgumentException:不是托管类型

  •  1
  • Pavanraotk  · 技术社区  · 7 年前

    我有一个实体管理器存储库,设置如下:

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(datasource());
        em.setJpaProperties(hibernateProperties(dynamicConfiguration));
        em.setPackagesToScan(new String[] {"<my model package>"});
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        return em;
    }
    

    我的实体类定义如下:

    @Entity
    @Table(name = "model")
    @Getter
    @Setter
    @NoArgsConstructor
    public class Model {
    
    @Column(name = "serialNumber")
    private String serialNumber;
    
    @Column(name = "region")
    private String region;
    
    @Column(name = "created")
    private Date created;
    
    @Column(name = "updated")
    private Date updated;
    
    @Column(name = "status")
    private String status;
    
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private Long id;
    
    }
    

    我的存储库bean如下所示:

    @Repository
    public interface ModelRepository extends JpaRepository<Model, Long>, ModelCustomRepository<Model, Long> {
    
    }
    

    我的自定义存储库

    @NoRepositoryBean
    public interface ModelCustomRepository<E, L extends Number>{
    
    List<Model> getModelsSkipUpdated();
    }
    

    我的自定义存储库实现

    public class ModelCustomRepositoryImpl implements ModelCustomRepository<Model, Long> {
    
    @Autowired
    private DynamicConfiguration dynamicConfiguration;
    
    @Qualifier("entityManageFactory")
    @Autowired
    private EntityManagerFactory entityManagerFactory;
    
    @Override
    public List<Model> getModelsForProvisioning() {
        Integer limit = dynamicConfiguration.getIntProperty("model.limit", 25).get();
        Query modelQuery = entityManagerFactory.createEntityManager().createNativeQuery(
                        "SELECT * FROM Model WHERE status = :status LIMIT :limit for update skip locked",
                        Model.class);
        modelQuery.setParameter("status", NOT_PROCESSED.name());
        modelQuery.setParameter("limit", limit);
        return modelQuery.getResultList();
    }
    }
    

    我得到下面的错误,我不知道为什么我会得到错误

    Caused by: java.lang.IllegalArgumentException: Not a managed type: class <package>.Model
    at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:472)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:73)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:181)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:119)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:102)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:298)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$3(RepositoryFactoryBeanSupport.java:287)
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:141)
    at org.springframework.data.util.Lazy.get(Lazy.java:63)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:290)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:102)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1769)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1706)
    ... 54 more
    

    我不使用弹簧靴,因为这是AWS lambda。有没有办法解决这个问题?因此没有@实体扫描。

    我的模型类与实体管理器工厂bean生成类不在同一个包中。

    另一方面,如果有办法在@Repository bean中获得跳过锁定的查询,请也告诉我。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Xaero Degreaz    7 年前

    根据我对您问题的评论:由于您无法使用 @EntityScan ,也许您需要提供 persistence.xml 描述实体。