【发布时间】:2018-03-26 01:27:33
【问题描述】:
我有一个实体管理器仓库,设置如下:
@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 中获取跳过锁定查询,请告诉我。
【问题讨论】:
-
您使用的是哪个数据库实现? (MySQL、PostgreSQL 等)?对于
Skip Locked,MySQL不支持,但是如果你使用Hibernate,你可以用其他DBMS实际配置它:docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/…。您所做的是将PESSIMISTIC_WRITELockMode设置为javax.persistence.lock.timeout= 2。至于非托管异常,因为您没有使用Spring Boot,您确定不需要描述您的实体的persistence.xml文件因为你不能使用@EntityScan? -
我们正在使用 Postgres DB。是的,我可以做 PESSIMISTIC_WRITE 锁定模式的事情。关于persistence.xml,让我试一试,然后回复你,可能会奏效。我不确定是否有必要。
-
因为我在创建 entitymanager 时有要扫描的包,所以我认为这就足够了。我错了吗? @XaeroDegreaz
-
老实说,这是一个很好的问题——我从来没有在不使用 Spring Boot 的情况下使用过这些。我有兴趣了解自己(尽管我可能从未真正遇到过这个用例)。
-
我不能使用 spring-boot,因为我在没有 spring-boot 初始化的情况下创建了上下文。 Lambda 启动,我有上下文初始化程序启动我的 spring 上下文。
标签: java spring spring-data-jpa