簡體   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