Hibernate5 一對多關系的建立
**我這裡直接以學生stu表與教室clss表為例子說明一對多關系(使用clss是因為防止class關鍵字)
總的項目結構如下
先拷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());
}