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

标签 java spring spring-data-jpa

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

@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

我不使用 spring-boot,因为这是一个 AWS lambda。有办法解决这个问题吗?因此没有@EntityScan。

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

顺便说一句,如果有办法在 @Repository bean 中获取跳过锁定查询,也请让我知道。

最佳答案

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

关于java - Spring - AWS(无 Spring Boot): java. lang.IllegalArgumentException:不是托管类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49482745/

相关文章:

java - 如何使用 Dozer 指定循环关系的递归限制或级别

Java:分割分号分隔的字符串但忽略引号中的转义+分号

java - 从尺寸中删除魔数(Magic Number)

java - 如何在 Quartz Scheduler(简单触发器)中包含 endTime 属性?

ajax - 使用 bean 方法的结果 <h :selectBooleanCheckbox/> 时出现 PropertyNotFoundException

java - 无法创建池的初始连接,无法获取 JDBC 连接错误

java - 如何在android中旋转位图?

java - 为什么@RelatedToVia 有可选的类型和元素类参数?

java - eclipse中的Querydsl没有在maven项目中生成查询类型类

java - Spring Data JPA无限递归