【发布时间】:2016-01-13 15:00:19
【问题描述】:
我是春季数据的新手。我正在尝试使用 Spring Data 和 entitymanager 构建一个小型 Java 应用程序。项目结构如下:
对于 spring 配置,我创建了一个类,并在该类中定义了将用于通过这种方式创建实体管理器 bean 的 bean
SpringConfiguration:
@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "com.spring.data.persistence" })
public class SpringConfiguration implements TransactionManagementConfigurer{
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
driverManagerDataSource.setUrl(env.getProperty("jdbc.url"));
driverManagerDataSource.setUsername(env.getProperty("jdbc.user"));
driverManagerDataSource.setPassword(env.getProperty("jdbc.pass"));
return driverManagerDataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
localContainerEntityManagerFactoryBean.setDataSource(dataSource());
localContainerEntityManagerFactoryBean.setJpaDialect(jpaDialect());
localContainerEntityManagerFactoryBean.setPackagesToScan(new String[] { "com.spring.data.persistence.model" });
localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaAdapter());
return localContainerEntityManagerFactoryBean;
}
@Bean
public HibernateJpaVendorAdapter jpaAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
Boolean showSql = true;
hibernateJpaVendorAdapter.setShowSql(showSql);
hibernateJpaVendorAdapter.setDatabasePlatform(env.getProperty("hibernate.dialect"));
hibernateJpaVendorAdapter.setGenerateDdl(false);
return hibernateJpaVendorAdapter;
}
@Bean
public JpaDialect jpaDialect() {
return new HibernateJpaDialect();
}
@Bean
public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor = new PersistenceExceptionTranslationPostProcessor();
persistenceExceptionTranslationPostProcessor.setRepositoryAnnotationType(Repository.class);
return persistenceExceptionTranslationPostProcessor;
}
@Bean
public PlatformTransactionManager transactionManager() {
EntityManagerFactory entityManagerFactory = entityManagerFactory().getObject();
return new JpaTransactionManager(entityManagerFactory);
}
@Bean
public PlatformTransactionManager annotationDrivenTransactionManager() {
return transactionManager();
}
}
为了能够访问数据库,我创建了 DAO 类 UserDao,它只允许在表 User 中创建一行。
IUserDao 界面
public interface IUserDao {
public User create(User user);
}
UserDao 类
@Repository
public class UserDao implements IUserDao{
@PersistenceContext
private EntityManager entityManager;
public UserDao()
{
super();
}
public User create(User user) {
try {
this.entityManager.persist(user);
return user;
} catch (PersistenceException ex) {
ex.printStackTrace();
return null;
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
return null;
}
}
}
这就是用户的实体类:
用户实体
@Entity
public class User {
@Id
@GeneratedValue
@Column(name="USER_ID")
private int id;
@Column(name="USER_NAME")
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是对所做工作的一个小测试
测试
public class UserTest {
@Autowired
UserDao userDao;
@Test
public void test() {
User user=new User();
user.setName("User1");
userDao.create(user);
}
}
但问题是,如果我运行 main,我会得到异常 NullPointerException,因为 userDao 的值为 null,因此未定义 UserDao bean。 我做的有什么问题?
【问题讨论】:
-
请查看 Spring Data JPA。您编写了大量不必编写的代码。 spring.io/guides/gs/accessing-data-jpa
标签: java spring hibernate spring-data spring-data-jpa