繁体   English   中英

Spring,Hibernate,JUnit注释实体

[英]Spring, Hibernate, JUnit Annotated Entity

我试图为我的JUnit ,Spring和Hibernate环境设置一个简单的测试环境。 我还尝试在Java中配置整个程序,暂时不要使用XML文件。

到目前为止,我能够使用@Autowire @Beans ,但是无法使用@Entity 我不断收到一个例外,说我的实体未注册。

这是我在做什么的一个示例:

JpaTestConfig.java

package com.springtest.test.configuration;

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
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;

@Configuration
@EnableTransactionManagement
public class JpaTestConfig {


    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){

      LocalContainerEntityManagerFactoryBean lcemfb
            = new LocalContainerEntityManagerFactoryBean();

        lcemfb.setDataSource(this.dataSource());
        lcemfb.setPackagesToScan(new String[] {"com.jverstry"});
    lcemfb.setPersistenceUnitName("MyTestPU");

        HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();
    lcemfb.setJpaVendorAdapter(va);

    Properties ps = new Properties();
    ps.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
    ps.put("hibernate.hbm2ddl.auto", "create");
    lcemfb.setJpaProperties(ps);

    lcemfb.afterPropertiesSet();


        return lcemfb;

    }

    @Bean
    public DataSource dataSource(){

        DriverManagerDataSource ds = new DriverManagerDataSource();

        ds.setDriverClassName("org.hsqldb.jdbcDriver");
        ds.setUrl("jdbc:hsqldb:mem:testdb");
        ds.setUsername("sa");
        ds.setPassword("");

        return ds;

    }

    @Bean
    public PlatformTransactionManager transactionManager(){

        JpaTransactionManager tm = new JpaTransactionManager();
      tm.setEntityManagerFactory(this.entityManagerFactoryBean().getObject());

        return tm;

    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
        return new PersistenceExceptionTranslationPostProcessor();
    }

}

ServiceConfig.java

package com.springtest.test.configuration;

import com.springtest.services.UserService;
import com.springtest.services.UserServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = {
    "com.springtest.service"
})
public class ServiceConfig {

    @Bean
    public UserService getuserService() {
        return new UserServiceImpl();
    }

}

还有我的测试文件。 UserServiceTest.java

package com.springtest.test.services;

import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.springtest.pojo.User;
import com.springtest.services.UserService;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.springtest.test.configuration.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={ JpaTestConfig.class, 
                ServiceConfig.class})

public class UserServiceTest {

  @Autowired
  private UserService userService;

  @Test
  public void testCreateAndRetrieve() {
    String json = "{\"firstName\": \"John\", \"lastName\": \"Doe\"}";
    User user = userService.create(json);
    assertEquals("John", user.getFirstName());
  }
}

我的服务豆:

    package com.springtest.services;

    import java.util.List;

    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.PersistenceContextType;
    import javax.persistence.criteria.CriteriaQuery;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import com.google.gson.GsonBuilder;
    import com.springtest.pojo.User;

    @Service
    public class UserServiceImpl implements UserService {

        @PersistenceContext(type=PersistenceContextType.EXTENDED)
        EntityManager em;

        @Transactional
        public User create(String json) {
          User user = new GsonBuilder().create().fromJson(json, User.class);
          em.persist(user);
            return user;
        }

    }

还有我的Entity类:

package com.springtest.pojo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue
    private Integer id;
    private String firstName;
    private String lastName;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

总之,如何在Java类@Configuration文件上注册实体?

谢谢,

问题出在我的JpaTestConfiguration文件上的软件包扫描程序。 更具体地说,这一行:

lcemfb.setPackagesToScan(new String[] {"com.springtest.pojo"});

是将浏览软件包的@Entity注释类的软件包。 谢谢@Rembo的提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM