В вашем подходе есть несколько недостатков
- Смешивание 3 разных версий Spring (5.0, 4.2 и 4.0)
- Использование спящей версии, которая не поддерживается Spring 4
- Использование классов поддержки Hibernate 4 для настройки hibernate 5
- Пытался использовать Spring Boot, отступил и обошел его
- Использование Hibernate вместо JPA и Hibernate в качестве поставщика JPA
Прежде всего очистите pom.xml
и используйте управление зависимостями Spring Boots в своих интересах.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>springboot.beans.app</groupId>
<artifactId>SpringHibernateBasic5-OtherConfiguration</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringHibernateBasic5-OtherConfiguration</name>
<url>http://maven.apache.org</url>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<!-- Spring boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Обратите внимание, что большинство ваших зависимостей исчезло, так как большинство из них уже управляются одним из ваших стартеров (slf4j, logback, Spring зависимости). Вы хотите использовать Hibernate (и я предлагаю использовать JPA вместо простого hibernate), достаточно добавить spring-boot-starter-data-jpa
, чтобы получить все необходимые зависимости.
Затем создайте application.properties
в src/main/resources
и поместите туда следующее (вычтено из вашего вопроса).
spring.datasource.url=jdbc:mysql://localhost:3306/hibernate_mysql7?useSSL=false
spring.datasource.username=XXXX
spring.datasource.password=XXXX
spring.jpa.hibernate.ddl-auto=update
Это настроит источник данных и создаст схему (хотя лучше не использовать это в работе!).
Теперь измените ваш SpringHibernateMain
, добавьте к нему аннотацию @SpringBootApplication
и измените метод main
. Также поместите ваши сущности в соответствующий субпакет.
@SpringBootApplication
public class SpringHibernateMain {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(SpringHibernateMain.class ,args);
ManageEmployee manager = context.getBean(ManageEmployee.class);
/* Add few employee records in database */
Integer empID1 = manager.addEmployee("Spring222", "TODAY222", 30000);
Integer empID2 = manager.addEmployee("Avraham-spring", "Das", 5000);
Integer empID3 = manager.addEmployee("Sarah wigh spring", "Paul", 10000);
/* List down all the employees */
manager.listEmployees();
/* Update employee's records */
manager.updateEmployee(empID1, 5000);
System.out.println(empID2 + " = empID2");
/* Delete an employee from the database */
manager.deleteEmployee(empID2);
/* List down new list of the employees */
manager.listEmployees();
InsertRecords2 producer = context.getBean(InsertRecords2.class);
producer.updateProducts();//it's running insertion from inside
System.out.println("check if done");
}
}
Теперь поместите SpringHibernateMain
в приличный пакет, такой как springboot.beans.app
(как у вас), и поместите сущности в springboot.beans.app.entities
, а все остальное в springboot.beans.app.services
(вместо того, что у вас есть сейчас).
Вам остается только «переписать» ваши классы InsertRecords2
и ManageEmployee
, чтобы использовать EntityManager
вместо простого SessionFactory
. Он по-прежнему будет использовать Hibernate, но в целом лучше использовать JPA и только обычный Hibernate в тех случаях, когда вам это действительно нужно.