Hibernate表中数据多对多
标签: JAVA框架
学生和课程多对多的练习
订单(订单id 订单名称)和商品的关系 一个订单可以有多个商品 一个商品可以在多个订单中
1 生成一个新的订单,并添加3个新商品
2 生成一个新的订单,并添加2个已经存在商品
3 把某个订单的一个商品替换为另一个新的商品
4 把某个订单的一个商品替换为另一个已经存在的商品
5 删除某个订单中的所有商品
学习过程
第一步创建工程HomeWork1219,导入jar包
第二步在src目录下创建hibernate.cfg.xml
第三步配置hibernate.cfg.xml文件
hibernate.cfg.xml文件的配置信息
<?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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<!-- 这里配置数据库相关信息 -->
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/jdbc03
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- update每次hibernate启动的时候,检查表是否存在,如果不存在,创建,如果存在,则什么都不做 -->
<property name="hbm2ddl.auto">update</property>
<!-- 这里配置可持续化映射信息 -->
<mapping resource="com/cd/domain/Goods.hbm.xml"/>
<mapping resource="com/cd/domain/Order.hbm.xml"/>
</session-factory>
</hibernate-configuration>
第四步,创建可持续化类Goods,Orders
1>Goods
package com.cd.domain;
import java.util.Set;
public class Goods {
private int gid;
private String gname;
private String gdescription;
//写Set集合用于保存关联关系
private Set<Orders> orders;
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGdescription() {
return gdescription;
}
public void setGdescription(String gdescription) {
this.gdescription = gdescription;
}
public Set<Orders> getOrders() {
return orders;
}
public void setOrders(Set<Orders> orders) {
this.orders = orders;
}
}
2>Order
package com.cd.domain;
import java.util.Set;
public class Orders {
private int oid;
private String oname;
private String odescription;
//写Set集合用于保存关联关系
private Set<Goods> goods;
public int getOid() {
return oid;
}
public void setOid(int oid) {
this.oid = oid;
}
public String getOname() {
return oname;
}
public void setOname(String oname) {
this.oname = oname;
}
public String getOdescription() {
return odescription;
}
public void setOdescription(String odescription) {
this.odescription = odescription;
}
public Set<Goods> getGoods() {
return goods;
}
public void setGoods(Set<Goods> goods) {
this.goods = goods;
}
}
第五步,创建可持续化类的映射(在于可持续化类相同的包下)
1>Goods.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>
<class name="com.cd.domain.Goods" table="goods">
<id name="gid">
<generator class="increment"></generator>
</id>
<property name="gname" length="20"></property>
<property name="gdescription" length="50"></property>
<!-- 用set集合配置多对多关系 column name指的是表中列的名字 即good_order表中储存的列的名字 -->
<set name="orders" table="good_order" cascade="all">
<key>
<column name="gid"></column>
</key>
<many-to-many class="com.cd.domain.Orders" column="oid"></many-to-many>
</set>
</class>
</hibernate-mapping>
2>Order.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>
<class name="com.cd.domain.Orders" table="orders">
<id name="oid">
<generator class="increment"></generator>
</id>
<property name="oname" length="20"></property>
<property name="odescription" length="50"></property>
<!-- 用set集合配置多对多关系 column name指的是表中列的名字 即good_order表中储存的列的名字 -->
<set name="goods" table="good_order" cascade="all">
<key>
<column name="oid"></column>
</key>
<many-to-many class="com.cd.domain.Goods" column="gid"></many-to-many>
</set>
</class>
</hibernate-mapping>
第六步,创建一个CreateTable.java的测试类
用这个测试类来测试是否能建立表
package com.cd.db;
import org.hibernate.cfg.Configuration;
public class CreateTable {
public static void main(String[] args){
Configuration configuration = new Configuration();
configuration.configure();
configuration.buildSessionFactory();
}
}
第七步,写完成数据功能的类ManytoManyDao.java
目标功能
1 生成一个新的订单,并添加3个新商品
2 生成一个新的订单,并添加2个已经存在商品
3 把某个订单的一个商品替换为另一个新的商品
4 把某个订单的一个商品替换为另一个已经存在的商品
5 删除某个订单中的所有商品
package com.cd.dao;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.cd.domain.Goods;
import com.cd.domain.Orders;
import com.cd.util.HibernateUtil;
public class ManytoManyTest {
public static void main(String[] args){
//save3goodorder();
//save2goodorder();
//tihuangoods();
//tihuan2goods();
del();
}
// 5 删除某个订单中的所有商品
private static void del() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Orders order2 = (Orders)session.get(Orders.class, 2);
order2.getGoods().clear();
transaction.commit();
session.close();
}
// 4 把某个订单的一个商品替换为另一个已经存在的商品
private static void tihuan2goods() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Goods good1 = (Goods)session.get(Goods.class, 1);
Goods good4 = (Goods)session.get(Goods.class, 4);
Orders order2 = (Orders)session.get(Orders.class, 2);
//旧的订单拥有商品集合,所以可以直接对集合进行操作,无需新集合
order2.getGoods().remove(good4);
order2.getGoods().add(good1);
transaction.commit();
session.close();
}
// 3 把某个订单的一个商品替换为另一个新的商品
private static void tihuangoods() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Goods good4 = new Goods();
good4.setGname("商品4");
good4.setGdescription("商品4描述");
Goods good1 = (Goods)session.get(Goods.class, 1);
Orders order2 = (Orders)session.get(Orders.class, 2);
//旧的订单拥有商品集合,所以可以直接对集合进行操作,无需新集合
order2.getGoods().remove(good1);
order2.getGoods().add(good4);
//也无需用save方法提交保存
transaction.commit();
session.close();
}
// 2 生成一个新的订单,并添加2个已经存在商品
private static void save2goodorder() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Orders order2 = new Orders();
order2.setOname("订单2");
order2.setOdescription("订单2描述");
Set<Goods> goods = new HashSet<Goods>();
Goods good1 = (Goods)session.get(Goods.class, 1);
Goods good2 = (Goods)session.get(Goods.class, 2);
goods.add(good1);goods.add(good2);
//创建新订单放入商品时需要一个确定的集合
order2.setGoods(goods);
session.save(order2);
transaction.commit();
session.close();
}
// 1 生成一个新的订单,并添加3个新商品
private static void save3goodorder() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Orders order1 = new Orders();
order1.setOname("订单1");
order1.setOdescription("订单1描述");
Set<Goods> goods = new HashSet<Goods>();
for(int i=0;i<3;i++){
Goods good = new Goods();
good.setGname("商品"+(i+1));good.setGdescription("商品描述"+(i+1));
goods.add(good);
}
//创建新订单放入商品时需要一个确定的集合
order1.setGoods(goods);
session.save(order1);
transaction.commit();
session.close();
}
}