Hibernate关联映射关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate关联映射关系相关的知识,希望对你有一定的参考价值。
Hibernate关联映射关系
一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的)
1.1创建实体类(Emp(员工),Dept(部门))
/*
* 员工实体类
*/
public class Emp { private Integer empId; //员工编号 private String empName; //员工姓名 private Dept dept; //所处部门 //get(),set()方法省略 }
/* * 部门实体类 */ public class Dept { private Integer deptNo; //部门编号 private String deptName; //部门姓名 private Set<Emp> emps=new HashSet<Emp>(); //员工集合 //get(),set()方法省略 }
1.2创建小配置文件
Emp.hbm.xml
<?xml version="1.0"?> <!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.a.entity"> <class name="Emp" table="Emp"> <id name="empId"> <generator class="sequence"> <param name="sequence">SEQ_Student</param> </generator> </id> <property name="empName"></property> <!-- 植入一个Dept对象 多对一 --> <many-to-one name="dept" class="Dept" column="deptNo"></many-to-one> </class> </hibernate-mapping>
Dept.hbm.xml
<?xml version="1.0"?> <!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.a.entity"> <class name="Dept" table="Dept"> <id name="deptNo"> <generator class="sequence"> <param name="sequence">SEQ_Student</param> </generator> </id> <property name="deptName"></property> <set name="sets" inverse="true" cascade="save-update"> <key column="deptNo"></key> <!-- 多的一方的外建 --> <one-to-many class="Emp" /> </set> </class> </hibernate-mapping>
set元素:
<set>元素的name属性:设定持久化类名,此处为Dept类的emps属性
<set>元素的子元素<key>:column属性设定与所关联的持久化类对应的表的外键,此处为Emp表的外键DepeNo字段
<set>元素的子元素<one-to-many>:class属性设定与所关联的持久化类,此处为Emp类
那么,Hibernate会根据以上映射代码获得以下信息:
1.<set>元素表明Dept类的emps属性为java.util.Set集合类型
2.<one-to-many>子元素表明emps集合中存放的是一组Emp对象
3.<key>子元素表明Emp表通过外键DeptNo参照DEPT表
1.3.创建bibernate.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> <!-- Database connection settings 数据库连接设置 --> <!-- 驱动类 --> <property name="connection.driver_class">oracle.jdbc.OracleDriver</property> <!-- url地址 --> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">Hibernate</property> <property name="connection.password">orcl</property> <!-- SQL dialect (SQL 方言) --> <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!--在控制台打印后台的SQL语句 --> <property name="show_sql">true</property> <!-- 格式化显示SQL --> <!-- <property name="format_sql">true</property> --> <!-- 自动生成表 --> <property name="hbm2ddl.auto">update</property> <!-- 关联小配置 --> <mapping resource="cn/a/entity/Dept.hbm.xml" /> <mapping resource="cn/a/entity/Emp.hbm.xml" /> </session-factory> </hibernate-configuration>
1.4编写测试类oneTomanyTest
@Test public void onetomany() { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); //构建一个部门 Dept dept=new Dept(); dept.setDeptName("就業部"); //构建一个员工 Emp emp=new Emp(); emp.setEmpName("彪哥"); //指定员工所隶属的部门 emp.setDept(dept); dept.getSets().add(emp); //save() session.save(dept); //提交事务 tx.commit(); HibernateUtil.CloseSession(); }
补充:inverse属性和cascade属性
inverse:决定是否把对象中集合的改动反映到DB中,所以inverse只对集合起作用,也只有one-to-many和many-to-many有效,因为只有这两种关系有集合(而many-to-one和one-to-one只含有关系对方的一个引用)。
cascade:决定是否把对象的改动反映到DB中,所以,cascade对所有的关联关系都起作用。
2:inverse:inverse所描述的是对象之间关联关系的维护方式。
inverse:只存于集合标记的元素中。
inverse的作用是:把对象中对集合的改动反映到DB中
inverse的默认值是:false,表示集合的改动反映到DB中,inverse:false为主动方,由主动方负责维护关联关系。
inverse为true:表示不将改动过的集合反映到数据库中。
一对多:该属性在多的一方。应在少的一方设置inverse属性:true,而多的一方设置为false,这说明关联关系由多的一方来维护,如果
要少的一方维护,就会使插入或删除时一方去update多的一方每一个与这个对象有关系的对象,如果交给多的一方来维护,则会大大提高
了效率(因为关系就是在多的一方中,直接插入或删除就好了嘛)
多对多:属性存在独立表中。inverse属性默认为false;在多对多的关系中,关系两端的inverse不能都设置为false,如果都设置为false,则在插入操作时会导致关系表中插入两 次关系,也不能都设置成true(任何操作都不会影响到关系表中的数据)
,因此在任意一方设置为true,另一方设置为false;
二.双向关联多对多
1.创建是实体类(Emp,Project)
public class Emp { private Integer eid; private String ename; private Set<Project> pros=new HashSet<Project>(); public Integer getEid() { return eid; } public void setEid(Integer eid) { this.eid = eid; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public Set<Project> getPros() { return pros; } public void setPros(Set<Project> pros) { this.pros = pros; } }
/* * 项目实体类 */ public class Project { private Integer pid; private String pname; private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Set<Emp> getEmps() { return emps; } public void setEmps(Set<Emp> emps) { this.emps = emps; } }
2.编写配置文件
Emp.hbm.xml
<?xml version="1.0"?> <!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.a.entity"> <class name="Emp" table="Emp"> <id name="eid"> <generator class="native"> </generator> </id> <property name="ename"></property> <set name="pros" table="EmpPro"> <key column="eid"></key> <!-- 多的一方的外建 --> <many-to-many class="Project" column="pid"/> </set> </class> </hibernate-mapping>
Project.hbm.xml
<?xml version="1.0"?> <!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.a.entity"> <class name="Project" table="Project"> <id name="pid"> <generator class="sequence"> <param name="sequence">SEQ_Student</param> </generator> </id> <property name="pname"></property> <set name="emps" table="EmpPro"> <key column="pid"></key> <!-- 多的一方的外建 --> <many-to-many class="Emp" column="eid"/> </set> </class> </hibernate-mapping>
3.创建大配置文件
<?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> <!-- Database connection settings 数据库连接设置--> <!-- 驱动类 --> <property name="connection.driver_class">oracle.jdbc.OracleDriver</property> <!-- url地址 --> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">Hibernate</property> <property name="connection.password">orcl</property> <!-- SQL dialect (SQL 方言) --> <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!--在控制台打印后台的SQL语句 --> <property name="show_sql">true</property> <!-- 格式化显示SQL --> <!-- <property name="format_sql">true</property> --> <!-- 自动生成表 --> <property name="hbm2ddl.auto">update</property> <!-- 关联小配置 --> <mapping resource="cn/a/entity/Project.hbm.xml" /> <mapping resource="cn/a/entity/Emp.hbm.xml" /> <!--<mapping resource="cn/a/entity/Dept.hbm.xml" /> <mapping resource="cn/a/entity/Emp.hbm.xml" /> --> </session-factory> </hibernate-configuration>
4.编写测试类
@Test public void manyTomanyTest() { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); //构建一个部门 Project pro=new Project(); pro.setPname("技术部"); //构建一个员工 Emp emp=new Emp(); emp.setEname("迟明洋"); //指定员工所隶属的部门 emp.getPros().add(pro); pro.getEmps().add(emp); //save() session.save(pro); session.save(emp); //提交事务 tx.commit(); HibernateUtil.CloseSession(); }
运行结果Oracle数据库端
以上是关于Hibernate关联映射关系的主要内容,如果未能解决你的问题,请参考以下文章
关联映射级联操作关系维护 ---- Hibernate之一对多|多对一关系