【问题标题】:Spring, Hibernate, JUnit Annotated EntitySpring,Hibernate,JUnit 注释实体
【发布时间】:2014-03-13 00:55:43
【问题描述】:

我正在尝试为我的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());
  }
}

我的服务 Bean:

    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;
        }

    }

还有我的实体类:

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 文件中注册实体?

谢谢,

【问题讨论】:

  • 你有lcemfb.setPackagesToScan(new String[] {"com.jverstry"}); 我看不到任何类/实体有包com.jverstry

标签: java spring hibernate spring-mvc junit


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 2021-06-30
    • 2017-07-31
    • 1970-01-01
    • 2020-01-20
    • 2022-01-22
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多