java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))
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">
<hibernate-configuration>
<session-factory>
<!--驱动名称,URL,用户名,密码 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/test
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<!-- 输出SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="format_sql">true</property>
<!-- 根据映射文件生产表: create:创建(不推荐:先删除原有表,重新创建表,原有数据丢失) update:创建+更新记录(推荐,会保存原有数据) -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="cn/zzsxt/entity/Classinfo.hbm.xml" />
<mapping resource="cn/zzsxt/entity/Studentinfo.hbm.xml" /> <mapping resource="cn/zzsxt/entity2/Employee.hbm.xml" />
<mapping resource="cn/zzsxt/entity2/Dept.hbm.xml" /> <mapping resource="cn/zzsxt/entity3/Province.hbm.xml" />
<mapping resource="cn/zzsxt/entity3/City.hbm.xml" /> <mapping resource="cn/zzsxt/entity4/IdCard.hbm.xml" />
<mapping resource="cn/zzsxt/entity4/Person.hbm.xml" /> <mapping resource="cn/zzsxt/entity5/IdCard2.hbm.xml" />
<mapping resource="cn/zzsxt/entity5/Person2.hbm.xml" /> <mapping resource="cn/zzsxt/entity6/Emp.hbm.xml" />
<mapping resource="cn/zzsxt/entity6/Project.hbm.xml" /> </session-factory>
</hibernate-configuration>
1.单向多对一:
Classinfo:
package cn.zzsxt.entity; import java.io.Serializable; public class Classinfo implements Serializable {
private int classId;
private String className; public int getClassId() {
return classId;
}
public void setClassId(int classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
} }
Classinfo.hbm.xml:
<?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="cn.zzsxt.entity">
<class name="Classinfo">
<id name="classId">
<generator class="native"></generator>
</id>
<property name="className"></property>
</class>
</hibernate-mapping>
Studentinfo:
package cn.zzsxt.entity; import java.io.Serializable; public class Studentinfo implements Serializable {
private int studentId;
private String studentName;
private int studentAge;
private String studentAddress;
//和一方关联的实体对象(多对一)
private Classinfo classinfo; public Studentinfo() {
super();
// TODO Auto-generated constructor stub
} public Studentinfo(String studentName, int studentAge, String studentAddress) {
super();
this.studentName = studentName;
this.studentAge = studentAge;
this.studentAddress = studentAddress;
} public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getStudentAge() {
return studentAge;
}
public void setStudentAge(int studentAge) {
this.studentAge = studentAge;
}
public String getStudentAddress() {
return studentAddress;
}
public void setStudentAddress(String studentAddress) {
this.studentAddress = studentAddress;
}
public Classinfo getClassinfo() {
return classinfo;
}
public void setClassinfo(Classinfo classinfo) {
this.classinfo = classinfo;
} }
Studentinfo.hbm.xml:
<?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="cn.zzsxt.entity">
<class name="Studentinfo">
<id name="studentId">
<generator class="native"></generator>
</id>
<property name="studentName"></property>
<property name="studentAge"></property>
<property name="studentAddress"></property>
<!-- 多对一 -->
<many-to-one name="classinfo" class="Classinfo" column="classId" lazy="false"></many-to-one>
</class>
</hibernate-mapping>
TestManyToOneSave:
package cn.zzsxt.test; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity.Classinfo;
import cn.zzsxt.entity.Studentinfo;
import cn.zzsxt.utils.HibernateUtil; public class TestManyToOneSave {
/**
* 新建一个班级:Java01,添加两个学生zhangsan和lisi,并将这两个学生添加到Java01班级中
* @param args
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//新建班级Java01
Classinfo classinfo = new Classinfo();
classinfo.setClassName("Java01");
//新建两个学生zhangsan和lisi
Studentinfo stu1 = new Studentinfo("zhangsan",20,"郑州");
Studentinfo stu2 = new Studentinfo("lisi",22,"北京");
//维护班级和学生之间的关系:单向多对一(从多方维护关联关系):为学生指定班级
stu1.setClassinfo(classinfo);
stu2.setClassinfo(classinfo);
//保存班级和学生
session.save(classinfo);
session.save(stu1);
session.save(stu2);
tx.commit();
session.close(); }
}
TestManyToOneSelect:
package cn.zzsxt.test; import org.hibernate.Session; import cn.zzsxt.entity.Classinfo;
import cn.zzsxt.entity.Studentinfo;
import cn.zzsxt.utils.HibernateUtil; public class TestManyToOneSelect {
/**
* 查询编号为1的学生信息及对应的班级信息
* @param args
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Studentinfo student = session.get(Studentinfo.class,1);
System.out.println(student.getStudentName()+"---"+student.getStudentAge());
//获取学生对应的班级信息
Classinfo classinfo = student.getClassinfo();
System.out.println("班级名称:"+classinfo.getClassName());
session.close(); }
}
2.单向一对多:
Dept:
package cn.zzsxt.entity2; import java.util.HashSet;
import java.util.Set; public class Dept {
private int deptId;
private String deptName;
//在一方添加一个包含多方的集合
private Set<Employee> emps = new HashSet<Employee>();
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
} }
Dept.hbm.xml:
<?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="cn.zzsxt.entity2">
<class name="Dept">
<id name="deptId">
<generator class="native"></generator>
</id>
<property name="deptName"></property>
<!--
name="包含多方的集合名称"
-->
<set name="emps">
<!-- column="外键名称" -->
<key column="deptId"></key>
<!-- 一对多 class="集合中元素的类型(多方的类型)" -->
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
Employee:
package cn.zzsxt.entity2; public class Employee {
private int empId;
private String empName; public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
} }
Employee.hbm,xml:
<?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="cn.zzsxt.entity2">
<class name="Employee">
<id name="empId">
<generator class="native"></generator>
</id>
<property name="empName"></property>
</class>
</hibernate-mapping>
TestOneToManySave:
package cn.zzsxt.test; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity2.Dept;
import cn.zzsxt.entity2.Employee;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToManySave {
/**
* 添加一个部门:开发部
* 添加两个员工:小三和小四,并且将这两个员工分配到开发部
* @param args
* 推荐从多方维护关系:
* 1.生产的SQL语句数量少,执行效率较高。
* 2.可以避免因外键不能为NULL带来的异常。
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建开发部
Dept dept = new Dept();
dept.setDeptName("开发部2");
//创建两个员工
Employee emp1 = new Employee();
emp1.setEmpName("小三2");
Employee emp2 = new Employee();
emp2.setEmpName("小四2");
//单项一对多(只能在一方维护关联关系):为部门添加员工
dept.getEmps().add(emp1);
dept.getEmps().add(emp2);
//保存部门和员工
session.save(dept);
session.save(emp1);
session.save(emp2);
tx.commit();
session.close(); }
}
3.双向一对多,控制反转,级联:
City:
package cn.zzsxt.entity3; public class City {
private int cityId;
private String cityName;
//多方添加一个和一方关联的实体对象
private Province province;
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public Province getProvince() {
return province;
}
public void setProvince(Province province) {
this.province = province;
} }
City.hbm.xml:
<?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="cn.zzsxt.entity3">
<class name="City">
<id name="cityId">
<generator class="native"></generator>
</id>
<property name="cityName"></property>
<!--
many-to-one :多对一
cascade:级联(存在关联的数据表,一份随另外关联一方做相同的操作)
delete:级联删除
save-update:级联新增或修改
all:所有操作都级联
none:不级联
-->
<many-to-one name="province" class="Province" column="provinceId" cascade="save-update" ></many-to-one>
</class>
</hibernate-mapping>
Province:
package cn.zzsxt.entity3; import java.util.HashSet;
import java.util.Set; public class Province {
private int provinceId;
private String provinceName;
//一份添加一个包含多方的set集合
private Set<City> cities = new HashSet<City>();
public int getProvinceId() {
return provinceId;
}
public void setProvinceId(int provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
public Set<City> getCities() {
return cities;
}
public void setCities(Set<City> cities) {
this.cities = cities;
} }
Province.hbm.xml:
<?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="cn.zzsxt.entity3">
<class name="Province">
<id name="provinceId">
<generator class="native"></generator>
</id>
<property name="provinceName"></property>
<!--
name="包含多方的集合名称"
cascade="save-update|delete|all|none" 级联
inverse="true|false"
inverse代表关系维护的控制权是否反转,如果inverse值为true代表将关系维护的控制权交与对方
-->
<set name="cities" cascade="all" inverse="true">
<!-- column="外键名称" -->
<key column="provinceId"></key>
<!-- 一对多 class="集合中元素的类型(多方的类型)" -->
<one-to-many class="City"/>
</set>
</class>
</hibernate-mapping>
TestOneToMany:
package cn.zzsxt.test; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity2.Dept;
import cn.zzsxt.entity2.Employee;
import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToMany {
/**
* 添加一个省份:河南省
* 添加一个城市:郑州市
* 将郑州市添加到河南省中
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建省份
Province province = new Province();
province.setProvinceName("河南省");
//创建城市
City city = new City();
city.setCityName("郑州市");
//从一份维护关系:为省份添加城市;从多方维护关系:为城市设置省份
city.setProvince(province);
session.save(province);
session.save(city);
tx.commit();
session.close(); }
}
TestInverse:
package cn.zzsxt.test; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil;
/**
* inverse="true":代表将关系维护的控制权交与对方(多方)进行维护,自身无法维护关联关系
* @author Think
*
*/
public class TestInverse {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建一个河北省
Province province = new Province();
province.setProvinceName("山东省2");
//创建一个城市
City city = new City();
city.setCityName("济南2");
City city2 = new City();
city2.setCityName("菏泽2");
//为省份添加城市
province.getCities().add(city);
province.getCities().add(city2);
//通过省份级联城市
session.save(province);
tx.commit();
session.close(); }
}
TestCascade:
package cn.zzsxt.test; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil; public class TestCascade {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建一个河北省
Province province = new Province();
province.setProvinceName("山东省");
//创建一个城市
City city = new City();
city.setCityName("济南");
City city2 = new City();
city2.setCityName("菏泽");
//为省份添加城市
province.getCities().add(city);
province.getCities().add(city2);
//通过省份级联城市
session.save(province);
tx.commit();
session.close(); }
}
TestCascade2:
package cn.zzsxt.test; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil; public class TestCascade2 {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建一个河北省
Province province = new Province();
province.setProvinceName("河北省");
//创建一个城市
City city = new City();
city.setCityName("石家庄");
//为城市设置省份
city.setProvince(province);
//使用级联新增城市的同时新增省份
session.save(city);
tx.commit();
session.close(); }
}
4.一对一主键关联:
IdCard:
package cn.zzsxt.entity4; public class IdCard {
private int id;
private String cardNo;//身份证号;
private Person person;//关联的实体对象 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
} }
IdCard.hbm.xml:
<?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="cn.zzsxt.entity4">
<class name="IdCard">
<id name="id">
<!-- foreign:主键生产策略,该主键的值来源"外部"-->
<generator class="foreign">
<!-- 利用property属性指定主键来源于person中的主键 -->
<param name="property">person</param>
</generator>
</id>
<property name="cardNo"></property>
<!--
one-to-one:一对一
name属性:关联对象的名称
class属性:关联对象的类型
cascade:级联
constrained="true|false":可选属性. 代表是否是约束属性.
配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
数据与本表数据对应. -->
<one-to-one name="person" class="Person" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
Person:
package cn.zzsxt.entity4; public class Person {
private int id;
private String name;
private IdCard idCard;//关联的实体对象
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
} }
Person.hbm.xml:
<?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="cn.zzsxt.entity4">
<class name="Person">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!--
one-to-one:一对一
name属性:关联对象的名称
class属性:关联对象的类型
cascade:级联
constrained="true|false":可选属性. 代表是否是约束属性.
配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
数据与本表数据对应. -->
<one-to-one name="idCard" class="IdCard" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>
TestOneToOne:
package cn.zzsxt.test2; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity4.IdCard;
import cn.zzsxt.entity4.Person;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToOne {
public static void main(String[] args) {
Session session =HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Person person = new Person();
person.setName("zhangsan");
IdCard idCard = new IdCard();
idCard.setCardNo("412722199001011234");
//为人设置身份证
person.setIdCard(idCard);
//为身份证指定人
idCard.setPerson(person);
//通过级联添加人和身份证
session.save(person);
tx.commit();
session.close(); }
}
5.一对唯一外键关联:
IdCard2:
package cn.zzsxt.entity5; public class IdCard2 {
private int id;
private String cardNo;//身份证号;
private Person2 person2;//关联的实体对象 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public Person2 getPerson2() {
return person2;
}
public void setPerson2(Person2 person2) {
this.person2 = person2;
} }
Idcard2.hbm.xml:
<?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="cn.zzsxt.entity5">
<class name="IdCard2">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo"></property>
<!-- 多对一 -->
<many-to-one name="person2" class="Person2" column="pid" unique="true"></many-to-one>
</class>
</hibernate-mapping>
Person2:
package cn.zzsxt.entity5; public class Person2 {
private int id;
private String name;
private IdCard2 idCard2;//关联的实体对象
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard2 getIdCard2() {
return idCard2;
}
public void setIdCard2(IdCard2 idCard2) {
this.idCard2 = idCard2;
} }
Person2.hbm.xml:
<?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="cn.zzsxt.entity5">
<class name="Person2">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!--
one-to-one:一对一
name属性:关联对象的名称
class属性:关联对象的类型
cascade:级联
constrained="true|false":可选属性. 代表是否是约束属性.
配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
数据与本表数据对应. -->
<one-to-one name="idCard2" class="IdCard2" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>
TestOneToOne2:
package cn.zzsxt.test2; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity5.IdCard2;
import cn.zzsxt.entity5.Person2;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToOne2 {
public static void main(String[] args) {
Session session =HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Person2 person = new Person2();
person.setName("zhangsan");
IdCard2 idCard = new IdCard2();
idCard.setCardNo("412722199001011234");
//为人设置身份证
person.setIdCard2(idCard);
//为身份证指定人
idCard.setPerson2(person);
//通过级联添加人和身份证
session.save(person);
tx.commit();
session.close(); }
}
6.多对多双向关联:
Emp:
package cn.zzsxt.entity6; import java.util.HashSet;
import java.util.Set; public class Emp {
private int empId;
private String empName;
private Set<Project> projects = new HashSet<Project>();
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
} }
Emp.hbm.xml:
<?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="cn.zzsxt.entity6">
<class name="Emp" table="tbl_emp">
<id name="empId">
<generator class="native"></generator>
</id>
<property name="empName"></property>
<!--
table="中间表的表名"
-->
<set name="projects" table="tbl_emp_project" cascade="all">
<!-- column:中间表中与Emp对应的外键名称 -->
<key column="empId"></key>
<!--
many-to-many:多对多
class="集合中的元素类型"
column="中间表中与Project对应的外键名称"
-->
<many-to-many class="Project" column="projectId"></many-to-many>
</set>
</class>
</hibernate-mapping>
project:
package cn.zzsxt.entity6; import java.util.HashSet;
import java.util.Set; public class Project {
private int projectId;
private String projectName;
private Set<Emp> emps = new HashSet<Emp>(); public int getProjectId() {
return projectId;
}
public void setProjectId(int projectId) {
this.projectId = projectId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
} }
Project.hbm.xml:
<?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="cn.zzsxt.entity6">
<class name="Project" table="tbl_project">
<id name="projectId">
<generator class="native"></generator>
</id>
<property name="projectName"></property>
<!--
table="中间表的表名"
-->
<set name="emps" table="tbl_emp_project" inverse="true">
<!-- column:中间表中与Project对应的外键名称 -->
<key column="projectId"></key>
<!--
many-to-many:多对多
class="集合中的元素类型"
column="中间表中与Emp对应的外键名称"
-->
<many-to-many class="Emp" column="empId"></many-to-many>
</set>
</class>
</hibernate-mapping>
TestManyToMany:
package cn.zzsxt.test2; import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity6.Emp;
import cn.zzsxt.entity6.Project;
import cn.zzsxt.utils.HibernateUtil;
/**
*
* 添加两个员工:zhangsan和lisi
* 添加两个项目:OA项目和CRM项目
* 将zhangsan和lisi分配到OA项目组
* 将lisi分配到CRM项目组
* @author Think
*
*/
public class TestManyToMany {
public static void main(String[] args) {
Session session =HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建两个员工
Emp emp1 = new Emp();
emp1.setEmpName("张三");
Emp emp2 = new Emp();
emp2.setEmpName("李四");
//创建两个项目
Project project1 = new Project();
project1.setProjectName("OA项目");
Project project2 = new Project();
project2.setProjectName("CRM项目");
//关系维护的控制权在emp方,为员工添加项目
emp1.getProjects().add(project1);//为张三分配OA项目
emp2.getProjects().add(project1);//为李四分配OA项目
emp2.getProjects().add(project2);//为李四分配CRM项目
//保存员工和项目(级联)
session.save(emp1);
session.save(emp2);
tx.commit();
session.close(); }
}
java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))的更多相关文章
- 【Hibernate框架】关联映射(一对多,多对一)
根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...
- 【Hibernate框架】关联映射(一对一关联映射)
一.整理思路: 之前,小编总结过Mybatis的关联映射,接下来,再来总结一下hibernate的相关的关联映射,直接上图: 这张图,就是小编整理总结整个Hibernate的关联映射的一个大致思路. ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- Hibernate框架之关联映射入门
关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一:配置单向多对一关联 在Emp类中定义一个Dept属性,而在Dept类中无须定义用于存放Emp对象的集合属性 01.Dept. ...
- Hibernate之1-N关联映射
一.Hibernate之1-N关联映射 1. 哪边是 1 , 哪边是多 ? 须要从业务的角度来说明.比如,Employee 和 Department 之间就是 n-1 的关联关系,Order ...
- 012一对一 唯一外键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- 011一对一 唯一外键关联映射_单向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系
1.主键约束和外键约束 外键约束 * 外键必须是另一表的主键的值(外键要引用主键!) * 外键可以重复 * 外键可以为空 * 一张表中可以有多个外键! 概念模型在数据库中成为表 数据库表中的多对一关系 ...
- Hibernate框架--配置,映射,主键
SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate, 基于持久层的框架(数据访问层使用)! Spring, 创建对象处理对象的依赖关系以及框架整合! Da ...
随机推荐
- 清北学堂dp图论营游记day2
上午讲数位dp和背包问题. 先讲背包: 完全背包:换了个顺序: 多重背包: 多重背包优化: 这样把每个物品分成这些组,那么把他们转变成不同的物品,就变成了01背包问题: 滑动窗口取最值问题.单调队列优 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]
[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...
- postgresql 锁表查询语句
1 查找锁表的pid select pid from pg_locks l join pg_class t on l.relation = t.oid where t.relkind = 'r' an ...
- 三大方面,分析 to B和 to C产品的区别
作为互联网从业者,我们经常听到to B(或2B)和to C(或2C)两个概念.to B即面向企业客户,to C即面向普通用户.只要是互联网人基本都懂知道这两个概念,但如果别人再问“to B和to C产 ...
- EasyUI DataGrid列表,显示undefined
datagrid中,显示undefined的解决方法 在get函数中,将为null的值返回空的字符串 1 public class TestModel { 2 3 private String key ...
- jquery radio选择器 语法
jquery radio选择器 语法 作用::radio 选择器选取类型为 radio 的 <input> 元素.大理石平台价格表 语法:$(":radio") jqu ...
- Angular 主从组件
此刻,HeroesComponent 同时显示了英雄列表和所选英雄的详情. 把所有特性都放在同一个组件中,将会使应用“长大”后变得不可维护. 你要把大型组件拆分成小一点的子组件,每个子组件都要集中精力 ...
- https://stackblitz.com/github/cwiki-us-angular/cwiki-us-angular-app 导入后如何添加到自己的项目
将 https://stackblitz.com/github/cwiki-us-angular/cwiki-us-angular-app 导入到界面后,如何将这个项目添加到自己的项目里面. 然后再自 ...
- HDU 6667 Roundgod and Milk Tea
hdu题面 Time limit 6000 ms Memory limit 131072 kB OS Windows Source 2019 Multi-University Training Con ...
- Generalizing from a Few Examples: A Survey on Few-Shot Learning(从几个例子总结经验:少样本学习综述)
摘要:人工智能在数据密集型应用中取得了成功,但它缺乏从有限的示例中学习的能力.为了解决这一问题,提出了少镜头学习(FSL).利用先验知识,可以快速地从有限监督经验的新任务中归纳出来.为了全面了解FSL ...