天天看點

Hibernate5一對多關系的建立Hibernate5 一對多關系的建立

Hibernate5 一對多關系的建立

**我這裡直接以學生stu表與教室clss表為例子說明一對多關系(使用clss是因為防止class關鍵字)

總的項目結構如下

Hibernate5一對多關系的建立Hibernate5 一對多關系的建立

先拷maven開發包:**

<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>ht-hibernate-2</groupId>
	<artifactId>ht-hibernate-2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>ht-hibernate-2</name>
	<description />
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--指明hibernate的版本,在此處指明下面可以直接寫 ${hibernate.version}來引用,以後修改更友善-->
		<hibernate.version>5.4.0.Final</hibernate.version>
	</properties>
	<dependencies>
	
		<!-- hibernate核心開發包 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>
			   ${hibernate.version}
			</version>
		</dependency>
	
		<!-- mysql連接配接 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.47</version>
		</dependency>


		<!-- log4j開發包 用于生成日志 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.11.1</version>
		</dependency>

		<!-- 也是log4j的開發包 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.11.1</version>
		</dependency>

		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.glassfish.web</groupId>
			<artifactId>javax.servlet.jsp.jstl</artifactId>
			<version>1.2.2</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<version>3.1</version>`在這裡插入代碼片`
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
           

寫pojo實體類:

1.班級實體類Clss.java 班級中有學生集合 學生中有班級對象屬性

package com.pojo;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;

import com.sort.StudentSort;

public class Clss implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int clssid;
	private String clssname;
	//班級裡面有學生集合
	private Set<Stu> studentSet = new TreeSet<Stu>(new StudentSort());
	
	public Set<Stu> getStudentSet() {
		return studentSet;
	}
	public void setStudentSet(Set<Stu> studentSet) {
		this.studentSet = studentSet;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	public int getClssid() {
		return clssid;
	}
	public void setClssid(int clssid) {
		this.clssid = clssid;
	}
	public String getClssname() {
		return clssname;
	}
	public void setClssname(String clssname) {
		this.clssname = clssname;
	}
}

           

2.學生實體類:Stu.java

package com.pojo;

import java.io.Serializable;

public class Stu implements Serializable{
	public int getStuid() {
		return stuid;
	}
	public void setStuid(int stuid) {
		this.stuid = stuid;
	}
	public String getStuname() {
		return stuname;
	}
	public void setStuname(String stuname) {
		this.stuname = stuname;
	}
	public Clss getClss() {
		return clss;
	}
	public void setClss(Clss clss) {
		this.clss = clss;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
		private int stuid;
		private String stuname;
		//學生裡面有班級對象屬性
		private Clss clss;
}

           

映射檔案中的代碼:

stu.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 配置映射檔案的作用:描述類與表之間的映射關系( 1.建立類與表的映射   2.主鍵的映射    3.其他字段的映射  4.表與表之間的關系映射 )-->
	<!-- 類與表的映射 -->
	<class name="com.pojo.Stu" table="stu">
		<id name="stuid" column="stuid">
			<generator class="native"></generator>
		</id>
		<property name="stuname" column="stuname"></property>
		<!-- 學生與班級的關系   多對一  使用<many-to-one> 班級name是班級屬性    字段是外鍵的名字-->
		<many-to-one name="clss" column="c_id"></many-to-one>
	</class>
</hibernate-mapping>
           

clss.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 配置映射檔案的作用:描述類與表之間的映射關系( 1.建立類與表的映射   2.主鍵的映射    3.其他字段的映射  4.表與表之間的關系映射 )-->
	<!-- 類與表的映射 -->
	<class name="com.pojo.Clss" table="clss">
		<id name="clssid" column="clssid">
			<generator class="native"></generator>
		</id>
		<property name="clssname" column="clssname"></property>
		<!-- 班級中有學生集合  一對多的關系-->
		
		<set name="studentSet" cascade="save-update,delete" sort="com.sort.StudentSort">
			<key column="c_id"></key> <!-- 通過c_id外鍵與com.pojo.Clss建立一對多的關系 -->
			<one-to-many class="com.pojo.Stu"/>
		</set>
	</class>
</hibernate-mapping>
           

Hibernate總的配置檔案: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節點代表一個資料庫 -->
    <session-factory>

        <!-- 1. 資料庫連接配接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123</property>
        <!-- 資料庫方法配置, hibernate在運作的時候,會根據不同的方言生成符合目前資料庫文法的sql -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>


        <!-- 2. 其他相關配置 -->
        <!-- 2.1 顯示hibernate在運作時候執行的sql語句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 2.2 格式化sql -->
        <property name="hibernate.format_sql">true</property>
        <!-- 
        	2.3 自動建表  加了這句話   如果資料庫中存在相同的表則會替換   是以每次這樣新增的話  總是隻有最後一次添加資料 之前的資料會被删除  因為重建立了表
        <property name="hibernate.hbm2ddl.auto">create</property>
         -->
         
        <!--3. 加載所有映射-->
        <mapping resource="com/pojo/stu.hbm.xml"/>
        <mapping resource="com/pojo/clss.hbm.xml"/>
    </session-factory>  
</hibernate-configuration>
    
           

Log4j 用于生成日志的xml檔案:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="1800">
    <properties>
        <property name="LOG_HOME">/WEB-INF/logs</property>
        <property name="FILE_NAME">finance-pay</property>
    </properties>
 
 
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
 
        <RollingFile name="running-log" fileName="${LOG_HOME}/${FILE_NAME}.log"
            filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"
            immediateFlush="true">
            <PatternLayout
                pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
    </Appenders>
    <Loggers>
 
        <!-- <Logger name="com.cssweb.test.app" level="trace" additivity="true"> 
            <AppenderRef ref="running-log" /> </Logger> -->
 
        <Root level="info">
               <!-- 這裡是輸入到檔案,很重要-->
            <AppenderRef ref="running-log" />
            <!-- 這裡是輸入到控制台-->
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

           

最後就可以開始測試代碼了,可以自己從這些方面測試:

首先要根據配置生成表(寫在主方法中運作一下就好了),代碼如下:

public static void main(String[] args) {
		ServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
		Metadata metadata = new MetadataSources(registry).buildMetadata();
		SchemaExport export = new SchemaExport();
		export.create(EnumSet.of(TargetType.DATABASE), metadata);
	}
           

然後要進行下面的測試話必須先在資料庫中添加内容

可以自己通過界面化工具添加

也可以直接寫代碼添加,例如添加班級(添加學生一樣的):

public static void main(String[] args) {
		//1.讀取總的配置檔案
		Configuration configuration = new Configuration();
		configuration.configure("/hibernate.cfg.xml");
		SessionFactory factory = configuration.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.getTransaction();
		transaction.begin();
		
		Clss clss = new Clss();
		clss.setClssname("s67");
		
		session.save(clss);
		
		transaction.commit();
		
		session.close();
		
	}
           

1.同時新增學生和班級

public class 同時新增學生和班級 {

	public static void main(String[] args) {
		//1.讀取總的配置檔案
		Configuration configuration = new Configuration();
		configuration.configure("/hibernate.cfg.xml");
		SessionFactory factory = configuration.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.beginTransaction();
		
		//設定需要新增的學生姓名
		Stu stu = new Stu();
		stu.setStuname("小紅");
		
		Stu stu2 = new Stu();
		stu2.setStuname("小紫");
		//需要把該學生添加到哪個班級    通過班級編号得到該班級
		Clss clss = new Clss();
		clss.setClssname("s68");
		
		clss.getStudentSet().add(stu);
		clss.getStudentSet().add(stu2);
		
		session.save(clss); 
		
		transaction.commit();
		
		session.close();
		
	}

}

           

2.根據班級編号找學生:

public static void main(String[] args) {
		//1.讀取總的配置檔案
		Configuration configuration = new Configuration();
		configuration.configure("/hibernate.cfg.xml");
		SessionFactory factory = configuration.buildSessionFactory();
		Session session = factory.openSession();
		Transaction transaction = session.getTransaction();
		transaction.begin();
		//括号裡面寫hql語句       其中表是類名
		Query<Stu> query = session.createQuery("from Stu");
		List<Stu> list = query.list();
		for (Stu stu : list) {
			System.out.println(stu.getStuid()+"\t"+stu.getStuname()+"\t"+stu.getClss().getClssname());
		}
		
		transaction.commit();
		
		session.close();
		
	}
           

3.輸出某班級的所有學生:

Configuration configuration = new Configuration();
				configuration.configure("/hibernate.cfg.xml");
				//建立session工廠
				SessionFactory factory = configuration.buildSessionFactory();
				//得到session對象 (打開session)
				Session session = factory.openSession();
				//得到事務
				Transaction transaction = session.getTransaction();
				//打開事務
				transaction.begin();
				//要輸出血學生的班級
				Clss clss = session.get(Clss.class,5);
				//得到班級類中的學生集合
				Set<Stu> set = clss.getStudentSet();
				for (Stu stu : set) {
					System.out.println(stu.getStuid()+"\t"+stu.getStuname()+"\t"+stu.getClss().getClssname());
				}