【问题标题】:SpringBoot Integration with Mysql using HibernateSpring Boot 使用 Hibernate 与 Mysql 集成
【发布时间】: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


【解决方案1】:

我更喜欢使用 application.properties 来配置我的 Spring Boot 应用程序,作为一种更有效的方式来维护它,甚至定义更多的配置文件。

您的示例 DatabaseConfiguration.java 文件是一种强制您的应用程序以编程方式读取属性的方法,并且还可以在需要时添加一些逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2012-11-20
    • 2018-09-24
    • 2016-12-20
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多