【问题标题】:Spring Batch HibernateItemWriter "Not an entity" eventhough EntityScan is set (no xml configuration)即使设置了 EntityScan,Spring Batch HibernateItemWriter “不是实体”(没有 xml 配置)
【发布时间】:2020-05-03 02:22:59
【问题描述】:

我在 Spring-Batch 程序中设置 HibernateItemWriter 时遇到了一些问题。

这就是我的 HibernateConfig.class 的样子:

@Configuration
@EnableTransactionManagement
public class HibernateConfig {

@Autowired
private ApplicationContext context;

@Bean
public LocalSessionFactoryBean getSessionFactory() {
    LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
    factoryBean.setConfigLocation(context.getResource("mypath/hibernate.cfg.xml"));
    return factoryBean;
}

@Bean
public HibernateTransactionManager getTransactionManager() {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(getSessionFactory().getObject());
    return transactionManager;
}

和我相关的hibernate.cfg.xml

<?xml version = "1.0" encoding = "utf-8"?>
    <!DOCTYPE hibernate-configuration SYSTEM 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <property name="log4j.logger.org.hibernate=info">info</property>
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.SQLServer2012Dialect</property>
    <property name="hibernate.hikari.driverClassName">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="hibernate.hikari.jdbcUrl">jdbc:sqlserver://server;databaseName=dbname</property>        
    <property name="hibernate.hikari.username">no</property>
    <property name="hibernate.hikari.password">no</property>
    <property name="hibernate.hikari.poolName">Mssql-Pool</property>
    <property name="hibernate.hikari.connectionTimeout">10000</property>
    <property name="hibernate.hikari.minimumIdle">10</property>
    <property name="hibernate.hikari.maximumPoolSize">200</property>
    <property name="hibernate.hikari.idleTimeout">300000</property>
    </session-factory>
</hibernate-configuration>

这些是我在“应用程序”类中使用的注释:

@SpringBootApplication
@EnableBatchProcessing
@EntityScan(basePackages = "mypackagespath")
@Import(DataSourcesConfig.class) 
public class Application extends SpringBootServletInitializer ...

这就是我的 HibernateWriter 的样子:

@Bean
public HibernateItemWriter<MyEntity> writer() {
    LocalSessionFactoryBean localSessionFactoryBean = hibernatecfg.getSessionFactory();
    HibernateItemWriter<MyEntity> myWriter = new HibernateItemWriter<>();
    myWriter.setSessionFactory(localSessionFactoryBean.getObject());
    myWriter.afterPropertiesSet();
    return myWriter;
}

我的域类有@Entity 和@Table 注释,EntityScan 包路径很好。但不知何故,Hibernate 没有找到带注释的实体并给我以下错误:

exitStatus=exitCode=FAILED;exitDescription=java.lang.IllegalArgumentException: Not an entity [class <packages.MyEntity.class>]

我不想创建persistence.xml,这就是我想使用@EntityScan Annotation 的原因:

【问题讨论】:

    标签: java spring hibernate jpa spring-batch


    【解决方案1】:

    你可以参考下面的链接,也许会有所帮助,

    https://springbootdev.com/2017/11/13/what-are-the-uses-of-entityscan-and-enablejparepositories-annotations/

    @EntityScan(basePackages = {"com.springbootdev.domain.entity"}) @EnableJpaRepositories(basePackages = {"com.springbootdev.domain.repository"})

    【讨论】:

    • 感谢您的链接。提供的文本说,如果 JpaRepo 和实体不在主包的子包中,则需要注释。在我的情况下,这两个类都在 Main 的子包中......
    • 如果您直接或间接拥有主包下的所有子包,那么您可以使用@EnableAutoConfiguration
    • 我使用了@SpringBootApplication,它提供了Configuration EnableAutoConfiguration ComponentScan的特性所以EnableAutoConfiguration应该已经激活了。
    猜你喜欢
    • 2015-01-30
    • 2015-09-02
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多