【发布时间】:2018-12-25 15:48:23
【问题描述】:
我是 springboot 和 hibernate 的新手,无法弄清楚不同的注释,我知道对于数据库属性等其他设置,资源文件夹中有一个名为 application.properties 的文件,我们可以在其中设置数据库 url、用户名、密码等。
application properties
#Database
db.driver: com.mysql.jdbc.Driver
db.url: jdbc:mysql://localhost:3306/scm
db.username: root
db.password: password
# Hibernate
hibernate.dialect: org.hibernate.dialect.MySQLDialect
hibernate.show_sql: true
hibernate.hbm2ddl.auto: create
但我遇到了一个文件 DatabaseConfiguration.java,其中包含类似这样的代码。
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class HibernateConfiguration {
@Value("${db.driver}")
private String DB_DRIVER;
@Value("${db.password}")
private String DB_PASSWORD;
@Value("${db.url}")
private String DB_URL;
@Value("${db.username}")
private String DB_USERNAME;
@Value("${hibernate.dialect}")
private String HIBERNATE_DIALECT;
@Value("${hibernate.show_sql}")
private String HIBERNATE_SHOW_SQL;
@Value("${hibernate.hbm2ddl.auto}")
private String HIBERNATE_HBM2DDL_AUTO;
@Value("${entitymanager.packagesToScan}")
private String ENTITYMANAGER_PACKAGES_TO_SCAN;
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT);
hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
hibernateProperties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO);
sessionFactory.setHibernateProperties(hibernateProperties);
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(DB_DRIVER);
dataSource.setUrl(DB_URL);
dataSource.setUsername(DB_USERNAME);
dataSource.setPassword(DB_PASSWORD);
return dataSource;
}
@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory().getObject());
return txManager;
}
}
我为什么要两次提到数据库属性(在应用程序属性中,DatabaseConfig.java)
我为什么要为上述方法提供@Bean注解以及@Bean和@Autowire注解之间的关系和
有一些像 @UserDao 这样的自动装配注释,它们没有提供 @Bean 注释,那么它是如何被接受的,而对于 sessionFactory 自动装配我应该提供像 bean 这样的接受。
package com.candidjava.spring.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.candidjava.spring.bean.User;
import com.candidjava.spring.dao.UserDao;
@Service
@Transactional
public class UserServiceImp implements UserService {
@Autowired
UserDao userDao;
public List<User> getUser() {
// TODO Auto-generated method stub
return userDao.getUser();
}
public User findById(int id) {
// TODO Auto-generated method stub
return userDao.findById(id);
}
public void createUser(User user) {
// TODO Auto-generated method stub
userDao.addUser(user);
}
public void deleteUserById(int id) {
// TODO Auto-generated method stub
userDao.delete(id);
}
@Override
public User updatePartially(User user, int id) {
userDao.updateCountry(user,id);
return userDao.findById(id);
}
@Override
public User update(User user,int id) {
// TODO Auto-generated method stub
return userDao.update(user, id);
}
}
请解释一下DatabaseConfig中用到的@value等注解,什么是HibernateTransactionmanager,为什么需要。
【问题讨论】:
-
如果你不明白
@Bean,@Autowire,你应该先学习基本的spring教程,然后再尝试其他任何东西。本教程是一个很好的起点 (tutorialspoint.com/spring)。如果您搜索,您可以找到许多其他好的教程。 -
@Johna,好的,谢谢,但请解释为什么我需要在属性文件和 DatasourceConfig.java 中提到两次数据源属性
-
它没有设置数据库属性两次。您在 application.properties 文件中提及用户名、密码等,并在 DatabaseConfig.java 中访问这些值。
@Value("${db.username}") private String DB_USERNAME获取您为db.username设置的值并用它初始化DB_USERNAME。但在 Spring Boot 中,您不需要这样做,因为您的application.properties文件中的数据库设置会自动读取并在相关位置使用。 -
但我试过这样做,它是说对于自动装配 sessionFactory,我需要一个我在配置类中创建的 bean,但它仍然没有正确识别。如何自动装配 sessionFactory
-
这就是为什么要求您先学习基础知识。请尝试一个好的教程。否则,您将遇到一系列问题才能运行此代码。
标签: mysql spring hibernate spring-boot