Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法引用PersonsRepository接口的实例_Java_Spring_Hibernate - Fatal编程技术网

Java 无法引用PersonsRepository接口的实例

Java 无法引用PersonsRepository接口的实例,java,spring,hibernate,Java,Spring,Hibernate,我在这里学习Spring数据教程: 我正在尝试让我的Spring 4+Hibernate应用程序启动并运行。我根据指南创建了以下单元测试: /** * */ package com.corrisoft.air.db.integration; import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.f

我在这里学习Spring数据教程:

我正在尝试让我的Spring 4+Hibernate应用程序启动并运行。我根据指南创建了以下单元测试:

/**
 * 
 */
package com.corrisoft.air.db.integration;

import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;

import com.corrisoft.air.db.JPAConfiguration;
import com.corrisoft.air.db.repository.PersonsRepository;
import com.corrisoft.air.model.Person;

    /**
     * @author Corrisoft Android Development
     *
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {JPAConfiguration.class})
    @Transactional
    @TransactionConfiguration(defaultRollback = true)
    public class PersonsRepositoryIntegerationTests {

          @Autowired
          PersonsRepository personsRepository;

          @Test
          public void thatItemIsInsertedIntoRepoWorks() throws Exception {
            int id = 42;

            Person person = new Person();
            person.setId(id);

            person.setFirstName("Zaphod");
            person.setLastName("Beeblebrox");

            personsRepository.save(person);

            Person retrievedPerson = personsRepository.findById(id);

            assertNotNull(retrievedPerson);
            assertEquals(id, retrievedPerson.getId());
          }
    }

This tests the repository that I've created here:

    /**
     * 
     */
    package com.corrisoft.air.db.repository;

    import com.corrisoft.air.model.Person;
    import org.springframework.data.repository.CrudRepository;

    /**
     * @author Corrisoft Android Development
     *
     */
    public interface PersonsRepository extends CrudRepository<Person, Integer>{
        Person findById(long id);
    }
文档中说,如果我有如下JPA函数类,将从接口创建代理对象:

/**
 * 
 */
package com.corrisoft.air.db;

import java.sql.SQLException;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.orm.hibernate4.HibernateExceptionTranslator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.corrisoft.air.db.repository.PersonsRepository;

/**
 * @author Corrisoft Android Development
 * 
 */
@Configuration
@EnableJpaRepositories(basePackages = "com.corrisoft.db.repository",
                       includeFilters = @ComponentScan.Filter(value = { PersonsRepository.class }, type = FilterType.ASSIGNABLE_TYPE))
@EnableTransactionManagement
public class JPAConfiguration {

    @Bean
    public DataSource dataSource() throws SQLException {
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.H2).build();
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() throws SQLException {

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.corrisoft.air.model");
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();

        return factory.getObject();
    }

    @Bean
    public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
        return entityManagerFactory.createEntityManager();
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws SQLException {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }

    @Bean
    public HibernateExceptionTranslator hibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }
}

我已经在本教程中发现了几个问题,我认为这是另一个问题。

您正在扫描错误的软件包以查找存储库:

... basePackages = "com.corrisoft.db.repository" ...
而正确的答案是

import com.corrisoft.air.db.repository.PersonsRepository;

本教程提到有一个扩展
crudepository
ordersepository
接口。你有这个吗?永远不要创建一个
@Bean
方法来返回EntityManager,这会破坏正确的tx支持。Spring将为您解决这个问题。@M.Deinum我正在学习教程。一个差劲的开发者该怎么办?
import com.corrisoft.air.db.repository.PersonsRepository;