hibernate-----单向多对一

一、项目用到的包

hibernate-----单向多对一

下载地址:https://download.****.net/download/wwt819635881/11095021

二、新建一个java项目

在项目中新建一个lib文件夹,把要用到的包粘贴进去,右键build path------ add to build path

 

三、在src建立两个包,一个Entity,一个Test

目录结构:

hibernate-----单向多对一

 

四、实体层代码

Customer.java

package Entity;

public class Customer {

	private String id;			//客户id
	private String userName;	//用户名
	private String pwd;			//用户密码
	private String address;		//用户地址
	public Customer() {
		super();
	}
	
	public Customer(String userName, String pwd, String address) {
		
		this.userName = userName;
		this.pwd = pwd;
		this.address = address;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}

}

 

Order.java

package Entity;

import java.util.Date;

public class Order {
	
	private String id;		//订单ID
	private String OrderNo;	//订单编号
	private Date date;		//订单日期
	private Customer customer;	//客户类型变量
	public Order() {
		super();
	}
	
	public Order(String orderNo, Date date, Customer customer) {
		
		this.OrderNo = orderNo;
		this.date = date;
		this.customer = customer;
	}

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getOrderNo() {
		return OrderNo;
	}
	public void setOrderNo(String orderNo) {
		this.OrderNo = orderNo;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
	
}

 

Customer.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="Entity">
    
    <class name="Entity.Customer" table="CUSTOMER">
    <!-- 给表提供一个标识,也就是主键,同样需要提供生成策略,是数据库自增,还是手动增 -->
        <id name="id" column="ID">
            <!-- 生成器,自动生成主键  -->
            <generator class="uuid"/>
        </id>
    <!-- 该表的其它字段,默认列名为name的属性值,也可以用column属性对字段进行重命名 -->
        <!-- 用户名 -->
        <property name="userName" column="USERNAME" type="string" not-null="true"/>
         <!-- 用户密码 -->
        <property name="pwd" column="PWD" type="string" not-null="true"/>
        <!-- 用户地址-->
        <property name="address" column="ADDRESS" type="string"/>
    </class>
</hibernate-mapping> 

 

Order.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="Entity">
   
    <class name="Entity.Order" table="ORDERS">
    <!-- 给表提供一个标识,也就是主键,同样需要提供生成策略,是数据库自增,还是手动增 -->
        <id name="id" column="ID">
            <!-- 生成器,自动生成主键  -->
            <generator class="uuid"/>
        </id>
    <!-- 该表的其它字段,默认列名为name的属性值,也可以用column属性对字段进行重命名 -->
        <!-- 订单编号 -->
        <property name="orderNo" column="ORDERNO" type="string"/>
         <!-- 下单日期 -->
        <property name="date" column="ORDERDATE" type="timestamp"/>
        <!-- 单向关联N-1-->
        <many-to-one name="customer" column="CUSTOMER_ID" class="Customer"/>
    </class>
</hibernate-mapping> 

 

五、配置代码

hibernate.cfg.xml     这个xml文件一定是要在项目直接右键建立,别创建在src里!!!

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- mysql数据库连接驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库连接地址 -->
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/HibernateTest2?useUnicode=true&amp;characterEncoding=UTF8</property>
        <!-- 连接数据库用户名和密码 -->
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">1234</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 数据源(DBCP):数据库连接池 -->
        <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>

        <!-- 配置当前session上下文  保证同一个线程中获取的session是同一个-->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- 自动建表  里面的值也可以是create,但是每次都会新建一个表,影响效率,update在原有的表上面添加信息 -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 控制台显示sql语句 -->
         <property name="show_sql">true</property>
         
        <!-- sql语句格式化输出 -->
        <property name="format_sql">true</property>
      
       
        <mapping resource="Entity/Order.hbm.xml"/>
        <mapping resource="Entity/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

六、测试类代码

CreateTable.java

package Test;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
//将hbm生成ddl
public class CreatTable {
    public static void main(String[] args) {        
       //默认读取hibernate.cfg.xml文件
        Configuration cfg = new Configuration().configure();  
        //Commandline tool to export table schema to the database. This class may also be called from inside an application.  
        SchemaExport export = new SchemaExport(cfg);
        //将ddl打印到控制台,输入到数据库
        export.create(true, true);
    }
}  

 

输入这段代码后,右键run as JavaApplication

就可以看到navicat已经帮你建好表了,当然前提是记得在代码运行前在navicat建立你的数据库。

hibernate-----单向多对一

 

Client.java

package Test;

import org.hibernate.Transaction;


import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import Entity.Customer;
import Entity.Order;

public class Client {
	@SuppressWarnings("deprecation")
	public static void main(String[] args) {       
       
	Configuration config = new Configuration().configure();//加载配置文件hibernate.cfg.xml
    //根据配置文件创建会话工厂
    SessionFactory factory = config.buildSessionFactory();
	
    //根据会话工厂创建会话
    Session session = factory.getCurrentSession();
    //创建一个事物对象
  Transaction tx = session.beginTransaction();
    //new 一个订单对象
  Customer customer=new Customer("李白","666","广东广州");
  session.save(customer); 
   
   //添加两条记录
   Order order=new Order("1",new Date(),customer);
   Order order2=new Order("2",new Date(),customer);
 //将对象持久化到数据表中
   session.save(order);
   session.save(order2);
   
   
    //提交事务
    tx.commit();
    //关闭会话
    /*session.close();*/
    //关闭工厂
    factory.close();
		
	}

	
}

这个时候我们再右键run as-----run on Java Application

就可以看到控制台输出sql语句

hibernate-----单向多对一

 

回到Navicat就可以看到数据显示了

 

hibernate-----单向多对一

 

hibernate-----单向多对一

 

不能直接删除customer表的记录,因为customer_id是orders表的一个外键,删除了orders表的记录才能删除customer表的记录!

hibernate-----单向多对一