Mình đã giới thiệu với các bạn cơ bản về Hibernate và do đó các bạn cũng đã biết trong Hibernate đối tượng hiện thực interface SessionFactory sẽ là đối tượng nắm dữ các thông tin liên quan đến kết nối database, các entity để thao tác với database. Sẽ tốt hơn nếu đối tượng này được quản lý bởi Spring, khi nào chúng ta cần thì chúng ta có thể lấy ra để sử dụng ngay. Trong bài viết này, mình sẽ hướng dẫn các bạn cách sử dụng Hibernate trong Spring framework các bạn nhé!
Đầu tiên, mình sẽ tạo một Maven để làm ví dụ:
Spring dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.3</version> </dependency> |
Để làm việc với Hibernate, giống như JPA, chúng ta cũng cần thêm spring-orm dependency nữa:
1 2 3 4 5 |
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>6.0.3</version> </dependency> |
Hibernate dependency:
1 2 3 4 5 |
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.1.6.Final</version> </dependency> |
Trong bài viết này, mình sẽ sử dụng MySQL database nên mình cũng sẽ thêm MySQL Driver dependency như sau:
1 2 3 4 5 |
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.31</version> </dependency> |
Project Lombok:
1 2 3 4 5 6 |
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency> |
Để đơn giản, trong ví dụ này, mình chỉ định nghĩa một table chứa thông tin sinh viên với 2 cột như sau:
1 2 3 4 5 |
CREATE TABLE `student` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; |
Entity của table student có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.huongdanjava.springhibernate; import java.io.Serializable; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.Data; @Table(name = "student") @Entity @Data public class Student implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @Column private String name; } |
Đối với Hibernate, Spring chỉ hỗ trợ chúng ta duy nhất một class để tạo đối tượng hiện thực interface SessionFactory đó là: LocalSessionFactoryBean.
Đối tượng này cho phép chúng ta khai báo các thông tin liên quan đến database, entity luôn nên chúng ta không cần phải có tập tin cấu hình cho Hibernate nữa các bạn nhé.
Dưới đây là các thông tin cần thiết mà các bạn cần phải khai báo cho đối tượng LocalSessionFactoryBean trong Spring container:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="annotatedClasses"> <list> <value>com.huongdanjava.springhibernate.Student</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> |
Trong khai báo trên, như các bạn thấy, chúng ta có 3 thuộc tính của đối tượng LocalSessionFactoryBean cần phải khai báo:
Thuộc tính đầu tiên thì liên quan đến phần dataSource. DataSource ở đây chúng ta có thể hiểu nôm na là phần quản lý kết nối tới database. Chúng ta có thể khai báo nhiều loại DataSource khác nhau do nhiều tổ chức khác nhau implement interface javax.sql.DataSource.
Ở đây mình khai báo phần DataSource sử dụng đối tượng DriverManagerDataSource như sau:
1 2 3 4 5 6 |
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/spring_hibernate" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> |
Thuộc tính thứ 2 chúng ta cần khai báo đó là các thông tin liên quan đến entity. Trong bài viết này, mình chỉ định nghĩa một entity duy nhất là Student.
Thuộc tính cuối cùng là một số thuộc tính liên quan đến Hibernate. Chúng ta sẽ sử dụng dialect của MySQL, MySQLDialect và sẽ hiển thị câu SQL mà Hibernate dùng để execute database.
Vậy là chúng ta đã hoàn thành việc khai báo đối tượng hiện thực interface SessionFactory trong Spring container rồi, sử dụng nó thôi 😀
Ví dụ của mình như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.huongdanjava.springhibernate; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.query.Query; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Application { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml"); SessionFactory sf = (SessionFactory) ac.getBean("sessionFactory"); Session session = sf.openSession(); Query<Student> q = session.createQuery("From Student "); List<Student> resultList = q.list(); for (Student next : resultList) { System.out.println("Student name: " + next.getName()); } } } |
Hiện tại trong database của mình đang có những dữ liệu sau đây:
thì khi chạy kết quả sẽ là:
Huy Dao
Bài viết rất hay và bổ ích.
huy pham
anh có git hub ví dụ này ko ạ ,cho em xin với , em cảm ơn
Khanh Nguyen
Xem ở đây nhé em https://github.com/huongdanjavacom/huongdanjava.com
Hung Pham
SessionFactory sf = (SessionFactory) ac.getBean(“sessionFactory”);
vậy bản chất khi dùng sf thì nó là loại class gì bạn nhỉ?
SessionFactory của hibernate hay LocalSessionFactoryBean của spring-orm?
Khanh Nguyen
SessionFactory là một interface của Hibernate và implement của interface này là class LocalSessionFactoryBean đó bạn.
Ngô Xuân Dũng
Add ơi … connection DB bằng sql server thì sao ! làm hoài ko được
Thanks!
#Hoi_Dap
Khanh Nguyen
Bạn tham khảo bài viết này nhé https://huongdanjava.com/vi/ket-noi-mssql-server-trong-jpa.html
tuấn
Error creating bean with name ‘sessionFactory’ defined in class path resource [hibernate.xml]: Cannot resolve reference to bean ‘dataSource’ while setting bean property ‘dataSource’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘dataSource’ available
em code giong bai nay ma no hien loi ntn la sao v a
Khanh Nguyen
Em khai báo bean dataSource trong Spring container chưa nhỉ?
tuấn
e fix dc r.e tuong no link toi file dataSource.cam on a
tuấn
từ khi học java tới giờ toàn đọc tài liệu của anh…cảm ơn anh vì tất cả những kiến thức đã chia sẽ rất đầ đủ
Khanh Nguyen
Cảm ơn em 🙂