非春季启动应用,春季数据jpa保存无法正常工作

时间:2019-03-17 06:47:16

标签: spring hibernate spring-data-jpa

我遇到了一个问题,无法找到原因。我的Test类包含保存到数据库的方法,实际上没有使用@Transactional批注将任何内容保存到DB。但是,当我删除@Transactional时,它开始起作用。我几乎可以确定问题出在事务管理器上,但是这里出了什么问题?

这不起作用 TestSaveTransactional.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
        classes = { HibernateConfiguration.class},
        loader = AnnotationConfigContextLoader.class)
public class TestSaveTransactional {

@Autowired
private UserRepository userRepository;

@Test
@Transactional
public void testSaveUsersTransactional(){


   System.out.println("**********testSaveUserTransactional**********");
    StopWatch watch = new StopWatch();
    watch.start();

    final List<User> users = new LinkedList<User>();
    users.add(new User("He he", true));
    users.add(new User("She she", false));

    this.userRepository.save(users);
    watch.stop();

    System.out.println(watch.getTotalTimeMillis() + " mls");
    System.out.println("**********testSaveUserTransactional**********");
}

}

pom.xml

http://maven.apache.org/xsd/maven-4.0.0.xsd“>     4.0.0

<groupId>com.egs</groupId>
<artifactId>test-hibernate</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <springframework.version>4.3.9.RELEASE</springframework.version>
    <hibernate.version>4.3.6.Final</hibernate.version>
    <pgsql.connector.version>42.2.5</pgsql.connector.version>
    <joda-time.version>2.3</joda-time.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${springframework.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.10.6.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${pgsql.connector.version}</version>
    </dependency>

    <!-- Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${springframework.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

HibernateConfiguration.java

@Configuration
@EnableTransactionManagement
@PropertySource(value = { "classpath:application.properties" })
@ComponentScan(basePackageClasses = { HibernateConfiguration.class })
@EnableJpaRepositories(basePackages = {"com.egs.repository"})

public class HibernateConfiguration {

@Value("${jdbc.driverClassName}") private String driverClassName;
@Value("${jdbc.url}") private String jdbcUrl;
@Value("${jdbc.username}") private String username;
@Value("${jdbc.password}") private String password;

@Value("${hibernate.dialect}") private String hibernateDialect;
@Value("${hibernate.show_sql}") private String showSql;
@Value("${hibernate.format_sql}") private String formatSql;

@Bean
public HibernateJpaVendorAdapter jpaVendorAdapter(){
    return new HibernateJpaVendorAdapter();
}

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(jdbcUrl);
    dataSource.setUsername(username);
    dataSource.setPassword(password);

    return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean sessionFactory = new LocalContainerEntityManagerFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setJpaVendorAdapter(jpaVendorAdapter());
    sessionFactory.setPackagesToScan(
            new String[] { "com.egs.entity" });
    sessionFactory.setJpaProperties(hibernateProperties());

    return sessionFactory;
}

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

    return txManager;
}

private Properties hibernateProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.dialect", hibernateDialect);
    properties.put("hibernate.show_sql", showSql);
    properties.put("hibernate.format_sql", formatSql);
    return properties;
}

}

这一项可行 TestFindAllHibernate.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
        classes = { HibernateConfiguration.class},
        loader = AnnotationConfigContextLoader.class)
public class TestFindAllHibernate {

@Autowired private UserRepository userRepository;
@Autowired private PostRepository postRepository;

@Test
@Transactional(readOnly = true)
public void testFindAllUsers(){
    System.out.println("**********testFindAllUsers**********");
    StopWatch watch = new StopWatch();
    watch.start();
    System.out.println(this.userRepository.findAll());
    watch.stop();

    System.out.println(watch.getTotalTimeMillis() + " mls");
    System.out.println("**********testFindAllUsers**********");
}

@Test
@Transactional(readOnly = true)
public void testFindAllMaleUsers(){
    System.out.println("**********testFindAllMaleUsers**********");
    StopWatch watch = new StopWatch();
    watch.start();
    System.out.println(this.userRepository.findByMaleIsTrue());
    watch.stop();

    System.out.println(watch.getTotalTimeMillis() + " mls");
    System.out.println("**********testFindAllMaleUsers**********");
}

@Test
@Transactional(readOnly = true)
public void testFindAllPosts(){
    System.out.println("**********testFindAllPosts**********");
    StopWatch watch = new StopWatch();
    watch.start();
    System.out.println(this.postRepository.findAll());
    watch.stop();

    System.out.println(watch.getTotalTimeMillis() + " mls");
    System.out.println("**********testFindAllPosts**********");
}

}

0 个答案:

没有答案