SPRING-SOURCE.RU

Урок номер два. Учимся работать с Hibernate

Я буду использовать MEMORY таблицы, где данные содержаться в памяти, но любые изменения в структуре или содержании записываются в файл <dbname>.script. Этот файл считается при следующем запуске базы и MEMORY таблицы будут пересоздаваться с заполненным контентом. Важно помнить, что данные, хранящиеся в памяти, записываются в файл когда вы делаете команду SHUTDOWN (COMPACT | IMMEDIATELY). Но если вы остановите сервер просто закрыв его или еще как-нибудь (грубо), то данные не будут сохранены.

Запускаем HSQL сервер баз данных:

                        
java -cp hsqldb.jar org.hsqldb.Server
		

Мы не указываем ни имени, ни алиасов и поэтому имена файлов будут иметь маску test – имя по умолчанию.

Далее запускаем менеджер:

                        
java -cp hsqldb.jar org.hsqldb.util.DatabaseManager
		

В окне выберите HSQL Database Engine Server и нажмите ОК. Для начала создадим таблицу для работы и занесем в ее поля данные.

                        
create table Course (course_id integer, name varchar, course varchar, PRIMARY KEY (course_id));
insert into Course values (1,'Sam', 'Java');
insert into Course values (2,'peter', 'J2EE');
insert into Course values (3,'paul', 'JSF');
insert into Course values (4,'jonathan', 'Hibernate');
insert into Course values (5,'james', 'Spring');
select * from Course;
		

Spring hsqldb DatabaseManager

После этого выберите View -> Refersh Tree и вы увидите в левом окне надпись COURSE. Также после этого будут сгенерированы соответствующие файлы.

Набирайте команду SHUTDOWN COMPACT и запускайте ее. Теперь у нас есть файл test.script.

Давайте теперь перейдем к Hibernate

Снова запускаем сервер и переходим в Eclipse. Структура директорий показана на картинке.

Spring структура директорий

Вот содержание pom.xml

                        
<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mytutorial</groupId>
	<artifactId>simple</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>simple</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate</artifactId>
			<version>3.2.4.ga</version>
		</dependency>
		<dependency>
			<groupId>hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
			<version>1.8.0.7</version>
		</dependency>
	</dependencies>
	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>2.0.2</version>
					<configuration>
						<source>1.5</source>
						<target>1.5</target>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
	<repositories>
		<repository>
			<id>maven-repository.dev.java.net</id>
			<name>Java Dev Net Repository</name>
			<url>http://download.java.net/maven/2/</url>
			<releases>
				<enabled>true</enabled>
				<updatePolicy>never</updatePolicy>
			</releases>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>ibiblio.org</id>
			<name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
			<url>http://mirrors.ibiblio.org/pub/mirrors/maven2</url>
			<releases>
				<enabled>true</enabled>
				<updatePolicy>never</updatePolicy>
			</releases>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
</project>
		

Теперь пора создавать классы. Начнем с Course.java:

                        
package com.mytutorial;
public class Course {
	private Long id;
	private String name;
	private String course;
}
		

Делаем для всех этих свойств getters и setters:

                        
public class Course {
	private Long id;
	private String name;
	private String course;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCourse() {
		return course;
	}

	public void setCourse(String course) {
		this.course = course;
	}
}
		

Затем в директории ресурсов создаем файл Course.hbm.xml. Он нужен для связывания Course.java с HSQL базой данных, таблицей COURSE.

                        
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.mytutorial.Course" table="Course">
		<id name="id" column="course_id">
			<generator class="native" />
		</id>
		<property name="name" column="name" />
		<property name="course" column="course" />
	</class>
</hibernate-mapping>
		

Теперь создадим файл hibernate.cfg.xml:

                        
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!-- Database connection settings -->
		<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
		<property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
		<property name="connection.username">sa</property>
		<property name="connection.password"></property>
		<!-- JDBC connection pool (use the built-in) -->
		<property name="connection.pool_size">2</property>
		<!-- SQL dialect -->
		<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
		<!--
			Drop and re-create the database schema on start-up, also try with
			“update” to keep the previous values
		-->
		<property name="hbm2ddl.auto">create</property>
		<!-- Echo all executed SQL to stdout -->
		<property name="show_sql">true</property>
		<mapping resource="com/mytutorial/Course.hbm.xml" />
	</session-factory>
</hibernate-configuration>
		

Теперь создаем DAO класс CourseDao.java

                        
package com.mytutorial;

import java.util.List;

public interface CourseDao {
	
	public abstract void create(List listCourses);

	public abstract List findAll();
}
		

Теперь создаем его реализацию CourseDaoImpl.java

                        
package com.mytutorial;

import java.util.List;


import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class CourseDaoImpl implements CourseDao {
	
	private static final SessionFactory sessionFactory;
	
	static {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			sessionFactory = new Configuration().configure().buildSessionFactory();
		}
		catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}
	
	public void create(List<Course> listCourses) {
		Session session = sessionFactory.openSession();
		session.getTransaction().begin();
		for (Course course : listCourses) {
			session.save(course);
		}
		
		session.getTransaction().commit();
	}
	
	public List findAll() {
		Session session = sessionFactory.openSession();
		List<Course> list = session.createQuery("From Course").list();
		return list;
	}
}
		

Теперь создадим бизнес сервис CourseService.java

                        
package com.mytutorial;

import java.util.List;

public interface CourseService {
	
	public abstract void processCourse(List<Course> courses);

}
		

И его реализацию

                        
package com.mytutorial;

import java.util.List;

public class CourseServiceImpl implements CourseService {
	
	public void processCourse(List<Course> courses) {
		CourseDao dao = new CourseDaoImpl(); // tightly coupled
		dao.create(courses);
		List<Course> list = dao.findAll();
		System.out.println("The saved courses are --> " + list);
	}
}
		

Создаем App.java

                        
package com.mytutorial;

import java.util.ArrayList;
import java.util.List;

public class App {
	public static void main(String[] args) {
		List<Course> courses = new ArrayList<Course>(10);
		
		Course c1 = new Course();
		c1.setName("John");
		c1.setCourse("Java");
		courses.add(c1);
		
		Course c2 = new Course();
		c2.setName("Peter");
		c2.setCourse("Hibernate");
		courses.add(c2);
		
		CourseService service = new CourseServiceImpl(); // tightly coupled
		service.processCourse(courses);
	}
}
		

А потом в Course.java добавляем:

                        
@Override
public String toString() {
return new StringBuffer().append("id=" + id).append(",name=" + name)
.append(",course=" + course).toString();
}
		

Вот что мы получим на выходе:

                        
Hibernate: insert into Course (name, course, course_id) values (?, ?, ?)
Hibernate: call identity()
Hibernate: insert into Course (name, course, course_id) values (?, ?, ?)
Hibernate: call identity()
Hibernate: select course0_.course_id as course1_0_, course0_.name as name0_, course0_.course
as course0_ from Course course0_
The saved courses are --> [id=1,name=John,course=Java,
id=2,name=Peter,course=Hibernate]