您的位置:首页 > 其它

hibernate的一对多和多对一关系映射

2012-07-26 10:24 302 查看
//dep.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="com.total">

<class name="Dep">

<id name="depId">

<generator class="native"></generator>

</id>

<property name="depName"></property>

<!-- 关系 -->

<!--name表示部门表中有很多员工,class表示emps表示的类型,key是外键,它必须跟主表中的外键的名字一样,正是根据外键才能找到员工的 -->

<set name="emps" cascade="save-update">

<key column="depId"></key>

<one-to-many class="com.total.Emp"/>

</set>

</class>

</hibernate-mapping>

//emp.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="com.total">

<class name="Emp" >

<id name="empId">

<generator class="native"></generator>

</id>

<property name="empName"></property>

<many-to-one not-null="true" cascade="all" name="dep" column="depId" ></many-to-one><!--depId是外键的字段名,dep是外键的对象表示形式,cascede表示的级联,not-null表示外键不能为空 -->

</class>

</hibernate-mapping>

//Dep的代码

import java.util.HashSet;

import java.util.Set;

public class Dep {

private String depName;

private Integer depId;

private Set<Emp> emps = new HashSet<Emp>();

public String getDepName() {

return depName;

}

public void setDepName(String depName) {

this.depName = depName;

}

public Integer getDepId() {

return depId;

}

public void setDepId(Integer depId) {

this.depId = depId;

}

public Set<Emp> getEmps() {

return emps;

}

public void setEmps(Set<Emp> emps) {

this.emps = emps;

}

}

///Emp的代码

public class Emp {

private String empName;

private Integer empId;

private Dep dep;

public String getEmpName() {

return empName;

}

public void setEmpName(String empName) {

this.empName = empName;

}

public Integer getEmpId() {

return empId;

}

public void setEmpId(Integer empId) {

this.empId = empId;

}

public Dep getDep() {

return dep;

}

public void setDep(Dep dep) {

this.dep = dep;

}

}

//这是hibernate.cfg.xml的代码

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory name="foo">

<property name="show_sql">true</property>

<property name="myeclipse.connection.profile">mysql</property>

<property name="connection.url">

jdbc:mysql://localhost:3306/hibernate

</property>

<property name="connection.username">root</property>

<property name="connection.password">caohuan</property>

<property name="connection.driver_class">

com.mysql.jdbc.Driver

</property>

<property name="dialect">

org.hibernate.dialect.MySQLDialect

</property>

<property name="hibernate.hbm2ddl.auto">update</property>

<mapping resource="com/total/Dep.hbm.xml" />

<mapping resource="com/total/Emp.hbm.xml" />

</session-factory>

</hibernate-configuration>

//这是hibernateUtil的代码

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static SessionFactory factory;

private HibernateUtil(){};

static{

Configuration configuration = new Configuration().configure();

factory = configuration.buildSessionFactory();

}

public static SessionFactory getSessionFactory()

{

return factory;

}

public static Session getSession()

{

return factory.openSession();

}

}

//这是测试的代码

import java.util.Set;

import org.hibernate.Hibernate;

import org.hibernate.Session;

import org.hibernate.Transaction;

public class Main {

public static void main(String[] args) {

Session session = HibernateUtil.getSession();

Transaction transaction = session.beginTransaction();

/*Dep dep = new Dep();

dep.setDepName("a");

Emp emp = new Emp();

emp.setEmpName("张三");

emp.setDep(dep);

session.save(dep);

session.save(emp);

transaction.commit();

session.close();*/

/*Dep dep = new Dep();

dep.setDepName("liaonanbu");

Emp emp1 = new Emp();

emp1.setDep(dep);

emp1.setEmpName("李四");

Emp emp2 = new Emp();

emp2.setEmpName("李四");

emp2.setDep(dep);

session.save(dep);

session.save(emp1);

session.save(emp2);

emp1.setEmpName("caohuan");//这是持久化对象,hibernate会自动进行处理(即进行更新操作)

transaction.commit();

session.close();*/

//Emp emp = (Emp) session.get(Emp.class, 1);

//System.out.println(emp.getDep().getDepName());

/*Dep dep = (Dep) session.get(Dep.class, 1);

Set<Emp> emps = dep.getEmps();

for (Emp emp : emps) {

System.out.println(emp.getEmpName());

}*/

Dep dep = new Dep();

dep.setDepName("b");

Emp emp = new Emp();

emp.setEmpName("张三123");

emp.setDep(dep);

//dep.getEmps().add(emp);//部门里面增加一个员工

// Hibernate.initialize(emp.getDep());

session.save(emp);

transaction.commit();

session.close();

}

}

//这是第二个例子

//Dept.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.pojos.Dept" table="dept">

<!-- 主键 -->

<id name="depid" column="depid">

<generator class="native"></generator>

</id>

<!-- 其它字段 -->

<property name="depname" column="depname"></property>

<!-- 关系 key是外键名字

cascade=delete级联删除,删除主表时,子表也删除

cascade=save-update 级联添加

cascade=all (级联删除和添加)

cascade=none(默认,不级联)

-->

<set name="emps" cascade="delete,save-update">

<key column="depid"></key>

<one-to-many class="com.pojos.Emp"/>

</set>

</class>

</hibernate-mapping>

import java.io.Serializable;

import java.util.HashSet;

import java.util.Set;

public class Dept implements Serializable {

private int depid;// 部门id

private String depname; // 部门名称

private Set emps = new HashSet();// 多个员工

public int getDepid() {

return depid;

}

public void setDepid(int depid) {

this.depid = depid;

}

public String getDepname() {

return depname;

}

public void setDepname(String depname) {

this.depname = depname;

}

public Set getEmps() {

return emps;

}

public void setEmps(Set emps) {

this.emps = emps;

}

}

//Emp.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.pojos.Emp" table="emp">

<!-- 主键策略 -->

<id name="empid" column="empid">

<generator class="native"></generator>

</id>

<!-- 其它字段 -->

<property name="empname" column="empname"></property>

<!-- 关系(多个员工对应一个部门) -->

<many-to-one name="dep" column="depid">

</many-to-one>

</class>

</hibernate-mapping>

import java.io.Serializable;

public class Emp implements Serializable {

// 员工编号

private int empid;

// 员工姓名

private String empname;

// 所在部门

private Dept dep;

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 Dept getDep() {

return dep;

}

public void setDep(Dept dep) {

this.dep = dep;

}

}

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import com.sun.faces.el.FacesCompositeELResolver;

/*

* 工具类,获取session

*/

public class HibernateSessionFactory {

//读取总的配置文件

static Configuration cfg = new Configuration().configure();

//创建session工厂

static SessionFactory factory = cfg.buildSessionFactory();

//创建session

public static Session getSession(){

return factory.openSession();

}

}

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

public class 创建表 {

/**

* @param args

*/

public static void main(String[] args) {

Configuration cfg = new Configuration().configure();

SchemaExport export = new SchemaExport(cfg);

//是否显示sql,是否执行sql

export.create(true, true);

}

}

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.pojos.Dept;

public class 添加一个新部门 {

/**

* @param args

*/

public static void main(String[] args) {

Session session = HibernateSessionFactory.getSession();

Dept dept = new Dept();

dept.setDepname("了男部");

// 开启事务

Transaction tr = session.beginTransaction();

try {

session.save(dept);

tr.commit();

} catch (Exception e) {

e.printStackTrace();

tr.rollback();

} finally {

session.close();

}

}

}

import java.util.Set;

import org.hibernate.Session;

import com.pojos.Dept;

import com.pojos.Emp;

public class 输出1号部门所有员工 {

/**

* @param args

*/

public static void main(String[] args) {

Session session = HibernateSessionFactory.getSession();

//查找1号部门

Dept dept = (Dept) session.get(Dept.class, 1);

//得到这个部门所有员工

Set<Emp> set = dept.getEmps();

for (Emp emp : set) {

System.out.println(emp.getEmpname());

}

}

}

import java.util.List;

import java.util.Set;

import org.hibernate.Query;

import org.hibernate.Session;

import com.pojos.Dept;

import com.pojos.Emp;

public class 输出1号部门所有员工二 {

/**

* @param args

*/

public static void main(String[] args) {

Session session = HibernateSessionFactory.getSession();

String hql = "from Emp e where e.dep=?";

Query query = session.createQuery(hql);

query.setParameter(0, 1);

List<Emp> list = query.list();

for (Emp emp : list) {

System.out.println(emp.getEmpname());

}

}

}

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.pojos.Dept;

import com.pojos.Emp;

public class 添加新员工方法二 {

/**

* @param args

*/

public static void main(String[] args) {

Session session = HibernateSessionFactory.getSession();

// 查找一号部门

Dept dept = (Dept) session.load(Dept.class, 1);

// 添加新员工

Emp emp = new Emp();

emp.setEmpname("李四");

dept.getEmps().add(emp);

Transaction tr = session.beginTransaction();

try {

session.save(emp);

tr.commit();

} catch (Exception e) {

tr.rollback();

e.printStackTrace();

} finally {

session.close();

}

}

}

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.pojos.Dept;

import com.pojos.Emp;

public class 添加新员工方法一 {

/**

* @param args

*/

public static void main(String[] args) {

Session session = HibernateSessionFactory.getSession();

// 查找一号部门

Dept dept = (Dept) session.load(Dept.class, 1);

// 添加新员工

Emp emp = new Emp();

emp.setEmpname("张三");

emp.setDep(dept); //效率高

Transaction tr = session.beginTransaction();

try {

session.save(emp);

tr.commit();

} catch (Exception e) {

tr.rollback();

e.printStackTrace();

} finally {

session.close();

}

}

}

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.pojos.Dept;

public class 级联删除 {

/**

* @param args

* 级联:主表操作时,子表也操作 可以有:级联删除和级联添加 级联删除:删除主表,从表自动删除 级联添加:同时添加主表和从表

* 在默认的情况,不支持级联,要修改映射文件

* 注意:HQL不支持级联

*/

public static void main(String[] args) {

// 查找1号部门

Session session = HibernateSessionFactory.getSession();

Dept dept = (Dept) session.load(Dept.class, 1);

Transaction tr = session.beginTransaction();

try {

session.delete(dept);

tr.commit();

} catch (Exception e) {

e.printStackTrace();

tr.rollback();

} finally {

session.close();

}

}

}

import org.hibernate.Session;

import org.hibernate.Transaction;

import com.pojos.Dept;

import com.pojos.Emp;

public class 级联添加 {

/**

* @param args

* 同时添加新部门和新员工

*/

public static void main(String[] args) {

Session session = HibernateSessionFactory.getSession();

// 1.实例化新部门

Dept dept = new Dept();

dept.setDepname("国防部");

// 2.实例化新员工

Emp e1 = new Emp();

Emp e2 = new Emp();

e1.setEmpname("张三");

e2.setEmpname("李四");

// 3.把员工添加到新部门

dept.getEmps().add(e1);

dept.getEmps().add(e2);

// 4.保存新部门

Transaction tr = session.beginTransaction();

try {

session.save(dept);

tr.commit();

} catch (Exception e) {

e.printStackTrace();

tr.rollback();

} finally {

session.close();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: