先是兩個實體類的創建,這裏我簡單用物品類和訂單類進行演示
package com.qiu.many_to_many; //此處自己的工程包可以忽略
import java.util.Set;
/**
* @author 邱
* @2017年9月20日 多對多 備註:物品類
*/
public class Goods {
private long id;
private String type; //商品類型
private String name;
private double price;
private Set<Order> set;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Set<Order> getSet() {
return set;
}
public void setSet(Set<Order> set) {
this.set = set;
}
}
訂單的實體類
package com.qiu.many_to_many;
import java.util.Set;
/**
* @author 邱
* @2017年9月20日
* 備註: 訂單類 多對多
*/
public class Order {
private long id;//訂單編號
private double money;
private String address;
private Set<Goods> set;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Set<Goods> getSet() {
return set;
}
public void setSet(Set<Goods> set) {
this.set = set;
}
}
實體類比較簡單,大致看一下即可,主要是配置文件的編寫
物品類的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
-->
<!--約束文件-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 多對多外鍵 -->
<hibernate-mapping package="com.qiu.many_to_many">
<class name="Goods" table="tb_goods">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" length="20"/>
<property name="type" length="10"/>
<property name="price" />
<set name="set" table="tb_orderitem">
<key column="gid"></key>
<many-to-many class="Order" column="oid"></many-to-many>
</set>
</class>
</hibernate-mapping>
訂單的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
-->
<!--約束文件-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 一對一外鍵 -->
<hibernate-mapping package="com.qiu.many_to_many">
<class name="Order" table="tb_order">
<id name="id">
<generator class="native"></generator>
</id>
<property name="money" />
<property name="address" length="50"/>
<!--多對多 -->
<!--集合類型的屬性
name:屬性名
table:關係表的表名 -->
<set name="set" table="tb_orderitem">
<!--當前的類在中間表的外鍵的名稱 -->
<key column="oid"></key>
<!--集合的泛型的類型,標記與誰是多對多,並且指示中間表中的外鍵名稱 -->
<many-to-many class="Goods" column="gid"></many-to-many>
</set>
</class>
</hibernate-mapping>
全局配置文件把 四本一言搞清楚一般不會錯,記得把各個類的映射配置文件路徑加上
<?xml version="1.0" encoding="UTF-8"?>
<!--約束文件 -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- 全局配置 -->
<hibernate-configuration>
<!--Session工廠的設置,其實就是連接設置 -->
<session-factory>
<!--四本一言
四大基本標籤:驅動、url、用戶名、密碼
一言:方言,標記是哪一種數據庫 -->
<!--1、數據庫驅動類名全稱 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--2、數據庫的路徑 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_1710_moretable?characterEncoding=UTF-8</property>
<!--3、數據庫用戶名 -->
<property name="hibernate.connection.username">root</property>
<!--4、密碼 -->
<property name="hibernate.connection.password">123456</property>
<!--5、方言,一定要和數據庫版本一致 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</property>
<!--建表語句的執行:create\update -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--顯示自動生成的sql語句 -->
<property name="hibernate.show_sql">true</property>
<!--格式化sql語句 -->
<property name="hibernate.format_sql">true</property>
<!--啓用安全Session,就是可以調用getCurrentSession -->
<property name="hibernate.current_session_context_class">thread</property>
<!--多對多外鍵映射 -->
<mapping resource="com/qiu/many_to_many/Goods.hbm.xml" />
<mapping resource="com/qiu/many_to_many/Order.hbm.xml" />
</session-factory>
</hibernate-configuration>
下面進行一些簡單的演示
package com.qiu.many_to_many;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.qiu.utils.HibernateUtils;
/**
* @author 邱
* @2017年9月20日
* 備註:多對多的演示
*/
public class MyTest {
private Session session;
private Transaction tran;
// 每次測試方法執行之前調用
@Before
public void bef() {
session = HibernateUtils.openSession();
tran = session.beginTransaction();
}
// 每次測試方法結束後調用
@After
public void aft() {
tran.commit();
session.close();
}
//多對多 新增:
@Test
public void test1(){
Goods goods = new Goods();
goods.setName("月餅");
goods.setPrice(9.9);
goods.setType("糕點");
Order order = new Order();
order.setMoney(9.9);
order.setAddress("xxxxxxxxxxx");
//這裏只需要添加一次即可,否則重複添加
Set<Goods> set2 = new HashSet<>();
set2.add(goods);
order.setSet(set2);
System.out.println("新增:"+ session.save(order));
System.out.println("新增:"+ session.save(goods));
}
//多對多查詢
@Test
public void test2(){
Order order2 = session.get(Order.class, 1l);
System.out.println(order2.getAddress());
for(Goods g : order2.getSet()){
System.out.println(g.getName()+" "+g.getType());
}
Goods goods=session.get(Goods.class, 1l);
System.out.println(goods.getName()+" "+goods.getPrice()+"----->");
for(Order o : goods.getSet()){
System.out.println(o.getAddress()+" "+o.getMoney());
}
}
}