gpt4 book ai didi

java - Spring、Hibernate、JUnit 带注释的实体

转载 作者:行者123 更新时间:2023-12-01 13:17:16 24 4
gpt4 key购买 nike

我正在尝试为我的 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 文件上注册实体?

谢谢

最佳答案

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

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

是一个将浏览包以查找 @Entity 带注释的类的包。谢谢@Rembo的提示。

关于java - Spring、Hibernate、JUnit 带注释的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22367039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com