映射分四种类型:java
一对多 多对一 一对一 多对多mysql
1、单向一对多sql
什么是一对多的关系呢?数据库
就像班级和学生。站在班级的角度看。班级和学生就是一对多的关系。单向的session
那怎么样实现这种关系呢?app
1.在数据库中,能够经过添加主外键的关联,表现一对多的关系;ide
2.在java中,经过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有“多”的一端的对象。性能
![CDATA[这里放置须要显示的字符]]>ui
数据库链接URL,使用CDATA包含是为了避免让解析CDATA内部的特殊符号 如"&",若是不用CDATA则用"&"来代替"&"spa
//hibernate4.3的初始化用于会话的获取和关闭: public class HibernateUtil { private static SessionFactory sessionFactory; private static Session session; static { //建立configuration对象,读取hibernate.cfg.xml文件,完成初始化 Configuration config = new Configuration().configure(); StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(config.getProperties()); StandardServiceRegistry ssr = ssrb.build(); sessionFactory = config.buildSessionFactory(ssr); } //获取SessionFactory对象 public static SessionFactory getsessionFactory() { return sessionFactory; } //获取Session对象 public static Session getSession() { return sessionFactory.openSession(); } //关闭Session对象 public static void closeSession(Session session) { if (session != null) { session.close(); } } }
CREATE TABLE grade ( gid INT PRIMARY KEY, gname VARCHAR(20) NOT NULL, gdesc VARCHAR(50) ); CREATE TABLE student ( sid INT PRIMARY KEY, sname VARCHAR(20) NOT NULL, sex CHAR(2), gid INT ); ALTER TABLE student ADD CONSTRAINT fk_student_gid FOREIGN KEY (gid) REFERENCES grade(gid);
建立持久化类和映射文件并配置单向一对多关系
a.持久化类
1.建立学生持久化类
2.建立班级持久化类(在一方定义一个多方集合)
b.配置映射文件
<class name="com.entity.Grade" table="grade"> <id name="gid" column="gid" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="gname" type="java.lang.String"> <column name="gname" not-null="true" length="20"></column> </property> <property name="gdesc" type="java.lang.String"> <column name="gdesc"></column> </property> <!-- 配置单向一对多关系 --> <set name="一方实体类定义的多方的引用,即集合属性students" table="多方的表名student"> <key column="关联外键的列gid"></key> <one-to-many class="多方实体类的全类名com.entity.Student"></one> </set> </class>
<class name="com.entity.Student" table="student"> <id name="sid" column="sid" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="sname" type="java.lang.String"> <column name="sname" not-null="true" length="20"></column> </property> <property name="sex"> <column name="sex"></column> </property> </class>
c.在hibernate.cfg.xml中配置
<!-- 指定映射文件 -->
<mapping resource="com/entity/Grade.hbm.xml"></mapping>
<mapping resource="com/entity/Student.hbm.xml"></mapping>
映射文件中set元素的经常使用属性
2、单向多对一
单向多对一关联:
一、多对一的关系和关系数据库中的外键参照关系最匹配,即在己方(多方)的表中的一个外键参照另外一个表的主键;
二、经过在多方持有一方的引用实现,须要在“多”的一端使用<many-to-one>配置
单向多对一的配置:
一、在多方定义一方的引用 添加属性 private Grade grade; 添加get、set方法
二、在多方持久类的映射文件中添加 <many-to-one class name="指定对一方的引用,实际上就是一方引用定义的属性" class="一方对应的持久化类,即关联实体类,全类名" cloumn="外键的列名" ></many-to-one>
(注意:无需在一方添加关联映射,即set元素)
3、inverse属性和cascade属性
inverse属性:
一、一方的hbm.xml文件的<set>节点的inverse属性指定了关联关系的控制方向,默认由one方来维护;
二、关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系;
三、在一对多关联中,设置one方的inverse为true,这将有助于性能的改善。
cascade属性:
一、当设置了cascade属性不为none时,Hibernate会自动持久化所关联的对象;
二、cascade属性的设置会带来性能上的变更,须要谨慎设置;
————————————————————————————
属性值 含义和做用
all 对全部操做进行级联操做
save-update 执行保存和更新操做时进行级联操做
delete 执行删除时进行级联操做
none 对全部操做不进行级联操做
————————————————
说明:举个例子,见截图:
在向Grade添加Student后,保存Grade对象时,能不能不须要显示的保存Student对象,答案是能够的,可使用级联操做:在Grade的映射文件中的<set>节点添加cascade属性不为none,为"save-update".