----多对一的关系映射,在这里我们有一个实例,就是销售订单与销售人员的关系,我们假设一个销售人员可以有多个订单,同时一个订单只能有一个销售人员来产生。以下为这两个类:
订单类:
package manyToOne;
public class CarOrder {
private int id;
private String carName;
private Salesman salesman;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public Salesman getSalesman() {
return salesman;
}
public void setSalesman(Salesman salesman) {
this.salesman = salesman;
}
}
销售人员类:
package manyToOne;
public class Salesman implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String salesName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSalesName() {
return salesName;
}
public void setSalesName(String salesName) {
this.salesName = salesName;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
}
两个映射配置文件:
CarOrder映射文件
<?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="manyToOne.CarOrder" table="t_m2o_carorder">
<id name="id" column="cid">
<generator class="increment">
</generator>
</id>
<property name="carName" type="java.lang.String">
</property>
<!-- 对于manyToOne 是为了指明在多方中生成一个指向一 方的外键 ,
column是为了标识这个列名,也可以省略不写,不写的话默认外键列名为当前实体中一方的属性名
<many-to-one name="salesman" column="sid" class="manyToOne.Salesman"
cascade="all">
</many-to-one>-->
<many-to-one name="salesman" cascade="all">
</many-to-one>
</class>
</hibernate-mapping>
Salesman映射文件:
<?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="manyToOne.Salesman" table="t_m2o_salesman">
<id name="id" column="sid">
<generator class="increment">
</generator>
</id>
<property name="salesName" type="java.lang.String">
</property>
</class>
</hibernate-mapping>
编写一个测试类:
在这里本人使用的是Junit测试:
package manyToOne;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class JunitTestManyToOne {
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforClass(){
sessionFactory = new Configuration ().configure()
.buildSessionFactory();
}
@AfterClass
public static void afterClass(){
if(sessionFactory!=null){
sessionFactory.close();
}
}
@Test
public void createEntity(){
Session session =sessionFactory.openSession();
session.beginTransaction();
Salesman salesman = new Salesman();
salesman.setSalesName("skewen");
CarOrder carOrder = new CarOrder();
carOrder.setCarName("Volovo");
CarOrder carOrder1 = new CarOrder();
carOrder1.setCarName("Ford");
CarOrder carOrder2 = new CarOrder();
carOrder2.setCarName("BMW");
carOrder.setSalesman(salesman);
carOrder1.setSalesman(salesman);
carOrder2.setSalesman(salesman);
/***由于在CarOrder的配置文件——CarOrder.hbm.xml*******
***文件的 <many-to-one>的属性中已经指明了cascade="all"***********
****这样当CarOrder发生改变时会进行级联操作,我们可以不用保存salesman******
***而在保存CarOrder的对象时会自动保存Salesman的实例******/
//session.save(salesman);
session.save(carOrder);
session.save(carOrder1);
session.save(carOrder2);
session.getTransaction().commit();
session.close();
}
public static void main(String [] args){
beforClass();
}
}