当前位置: 首页 > 面试题库 >

Java SE + Spring数据+休眠

董高朗
2023-03-14
问题内容

我正在尝试使用Spring Data + Hibernate启动Java SE应用程序,并且到目前为止已经完成了以下工作:

配置文件

@Configuration
@PropertySource("classpath:hibernate.properties")
@EnableJpaRepositories
@EnableTransactionManagement
public class JpaConfiguration {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN =
            "entitymanager.packages.to.scan";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(
                env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new
                LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(org.hibernate
                .jpa.HibernatePersistenceProvider.class);
        entityManagerFactoryBean.setPackagesToScan(env.
                getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));

        entityManagerFactoryBean.setJpaProperties(hibProperties());

        return entityManagerFactoryBean;
    }

    private Properties hibProperties() {
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT,
                env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,
                env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        return properties;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }

    @Bean
    public MainBean mainBean() {
        return new MainBean();
    }
}

开始上课

public class Start {


    private static final String CONFIG_PACKAGE = "org.app.config";


    public static void main(String[] args) {

        try (AnnotationConfigApplicationContext ctx = new
                AnnotationConfigApplicationContext()) {

            ctx.scan(CONFIG_PACKAGE);
            ctx.refresh();

            MainBean bean = ctx.getBean(MainBean.class);
            bean.start();
        }
    }
}

主豆

public class MainBean {

        public void start() {

        System.out.println("Application Started. . .");


    }

}

但是我收到以下异常

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\MyPath\target\classes\org\app\config\JpaConfiguration.class]; nested exception is java.lang.IllegalArgumentException
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:281)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:220)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.scan(AnnotationConfigApplicationContext.java:153)
    at org.app.Start.main(Start.java:25)
Caused by: java.lang.IllegalArgumentException
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:257)
    ... 4 more

有人知道我在做什么错吗?


问题答案:

您看到的异常不是由无效的Spring配置引起的,而是由您的类路径设置引起的。感觉就像关于ASM库和Java 8的版本不兼容。已知Spring
3.2依赖的ASM版本与Java 8不兼容。

因此,如果要使用Java 8运行代码,则需要使用最新的Spring 4.0版本。



 类似资料:
  • 问题内容: 目前,我正在使用带有@Transactional批注的DriverManagerDataSource来管理事务。但是所有事务都非常非常慢,这可能是因为数据源每次都打开和关闭与db的连接。 我应该使用什么数据源来加快交易速度? 问题答案: 实际上不是连接池,只能用于测试。您应该尝试使用Apache Commons DBCP 。就像是:

  • 问题内容: 我正在尝试在Jetty 7.4中配置数据源。我可以使用Tomcat context.xml中的Web应用程序成功完成此操作。 这就是我在jetty.xml中的内容(这将是该码头实例中的唯一应用程序,因此我不介意在服务器范围内使用数据库连接-我宁愿不必在战争中进行配置) 。它位于最后一个上方的最底部: 在我的Web应用程序的WEB-INF / web.xml中: 最后,在我的hibern

  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 HIBERNATE CONF 道例 问题答案: 好。我找到了另一个解决方案,并且使用了相同的方法:添加另一个dataS

  • 问题内容: 我写这篇文章,以了解是否有人知道该怎么做: 我想做这个插入: 加密是存储在我的数据库中的函数,也是我想在代码中插入的函数。实际上,当我想在数据库中插入某些内容时,我会使用: 但是我想进行“自定义”插入,因为我需要使用该功能。 我正在使用hibernate+注释: 但是必须从文件中读取密钥“ cdp”,因此该解决方案对我不起作用。 我想在代码上使用一种方法来执行SQL查询(INSERT查

  • 问题内容: 我正在尝试使用Hibernate插入或更新大数据。我有一个包含350k对象的列表,当我使用Hibernate时,要花费数小时才能插入所有数据。 我正在使用以下代码进行此操作。我的开发环境是JDK1.4和Oracle数据库。 我正在使用批处理更新,还设置了属性50,但这并没有帮助。 我的对象与另一个对象具有一对一的关系,因此在这种情况下使用StatelessSession可能会出现问题。

  • 问题内容: 是否可以仅对hibernate-search的注释(bean => document / document => bean mapping)使用hibernate-search,而不使用数据库?如果是这样,是否有任何在线样本基本上显示了如何进行设置? 我发现了以下内容:http : //mojodna.net/2006/10/02/searchable-annotation-drive