【Hibernate】(4)Hibernate一對多映射

1. 一對多關聯

(1). 創建工程與數據庫

打開MyEclipse,創建工程導入所需要的jar包,配置hibernate.cfg.xml文件:

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123465</property>
		<property name="hibernate.connection.url">
        	<![CDATA[
        		jdbc:mysql://localhost:3306/one2many:useUnicode=true&characterEncoding=utf8
        	]]>
		</property>
		<property name="show_sql">true</property>
		<property name="hbm2ddl.auto">update</property>
	</session-factory>
</hibernate-configuration>
創建MySQL中數據庫one2many。

(2). 創建工具類:

public class HibernateUtil {
	private static SessionFactory sessionFactory;
	private static Session session;

	static {
		// 創建configuration對象,讀取hibernate.cfg.xml配置
		Configuration config = new Configuration().configure();
		StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
				.applySettings(config.getProperties());
		StandardServiceRegistry registry = builder.build();
		sessionFactory = config.buildSessionFactory(registry);
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static Session getSession() {
		session = sessionFactory.openSession();
		return session;
	}

	public static void closeSession(Session session) {
		if (session != null) {
			session.close();
		}
	}
}
(3). 創建表

create table grade(
gid int primary key,
gname varchar(20) not null,
gdesc varchar(50)
);
create table student(
sid int primary key,
sname varchar(20) not null,
sex char(2),
gid int
);
alter table student add constraint fk_student_gid foreign key (gid) references grade(gid);
(4). 創建Student和Grade類以及他們的關聯映射文件

<hibernate-mapping>

	<class name="com.thr.entity.Student" table="student">
		<id name="sid" column="sid" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="sname" type="java.lang.String">
			<column name="sname" length="20" not-null="true"></column>
		</property>
		<property name="sex">
			<column name="sex"></column>
		</property>
	</class>
</hibernate-mapping>
<hibernate-mapping>
	<class name="com.thr.entity.Grade" table="grade">
		<id name="gid" column="gid" type="java.lang.Integer">
			<generator class="increment"></generator>
		</id>
		<property name="gname" type="java.lang.String">
			<column name="gname" length="20" not-null="true"></column>
		</property>
		<property name="gdesc">
			<column name="gdesc"></column>
		</property>
		<!-- 配置單向一對多的關聯關係 -->
		<set name="students" table="student">
			<!-- 指定關聯的外鍵列 -->
			<key column="gid"></key>
			<one-to-many class="com.thr.entity.Student" />
		</set>
	</class>
</hibernate-mapping>
然後在hibernate.cfg.xml配置文件中添加這兩個文件的路徑:

		<!-- 指定關聯映射文件的路徑 -->
		<mapping resource="com/thr/entity/Grade.hbm.xml"/>
		<mapping resource="com/thr/entity/Student.hbm.xml"/>

(5). 編寫測試類

測試添加和查詢:

	/**
	 * 學生添加到班級
	 */
	@Test
	public void add() {
		Grade g = new Grade("三年二班", "哎呦不錯哦");
		Student s1 = new Student("張三", "男");
		Student s2 = new Student("李四", "女");
		g.getStudents().add(s1);
		g.getStudents().add(s2);

		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		session.save(g);
		session.save(s1);
		session.save(s2);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}

	/**
	 * 查詢班級中包含的學生
	 */
	@Test
	public void findStudentByGrade() {
		Session session = HibernateUtil.getSession();
		Grade g = (Grade) session.get(Grade.class, 1);
		System.out.println(g.toString());
		Set<Student> students = g.getStudents();
		for (Student s : students) {
			System.out.println(s);
		}
	}
修改和刪除測試:

	/**
	 * 修改學生信息
	 */
	@Test
	public void update() {
		Grade g = new Grade("三年三班", "還行吧");
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Student s = (Student) session.get(Student.class, 1);
		g.getStudents().add(s);
		session.save(g);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}
	
	/**
	 * 刪除學生信息
	 */
	@Test
	public void delete() {
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Student s = (Student) session.get(Student.class, 1);
		session.delete(s);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}
(6). set元素的常用屬性



2. 多對一關聯

給原來的Student類添加一個Grade成員,設置set和get方法,修改Student.hbm.xml配置,添加:

		<!-- 配置多對一關聯配置 -->
		<many-to-one name="grade" class="com.thr.entity.Grade"
			column="gid">
		</many-to-one>
編寫測試類:

	@Test
	public void save() {
		Grade g = new Grade("四年三班", "四年三班");
		Student s1 = new Student("Jerry", "男");
		Student s2 = new Student("kate", "女");
		// 設置關聯關係
		s1.setGrade(g);
		s2.setGrade(g);

		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		session.save(g);
		session.save(s1);
		session.save(s2);
		transaction.commit();
		HibernateUtil.closeSession(session);
	}


3. inverse和cascade屬性

(1). inverse屬性

<set>節點的inverse屬性指定關聯關係的控制方向,默認由one方來維護。

關聯關係中,inverse="false"則爲主動方,由主動方負責維護關聯關係。

在一對多關聯中,只能設置one方的inverse爲true,這將有助於性能的改善。

(2). cascade屬性

當設置了cascade屬性不爲none時,Hibernate會自動持久化所關聯的對象

cascade屬性的設置會帶來性能上的變動,需謹慎設置





發佈了80 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章