映射分四种类型:
一对多 多对一 一对一 多对多
一、单向一对多
什么是一对多的关系呢?
就像班级和学生。站在班级的角度看。班级和学生就是一对多的关系。单向的
那怎么样实现这种关系呢?
1.在数据库中,可以通过添加主外键的关联,表现一对多的关系;
2.在java中,通过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有“多”的一端的对象。
![CDATA[这里放置需要显示的字符]]>
数据库连接URL,使用CDATA包含是为了不让解析CDATA内部的特殊符号 如"&",如果不用CDATA则用"&"来代替"&"
//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元素的常用属性
二、单向多对一
单向多对一关联:
1、多对一的关系和关系数据库中的外键参照关系最匹配,即在己方(多方)的表中的一个外键参照另一个表的主键;
2、通过在多方持有一方的引用实现,需要在“多”的一端使用<many-to-one>配置
单向多对一的配置:
1、在多方定义一方的引用 添加属性 private Grade grade; 添加get、set方法
2、在多方持久类的映射文件中添加 <many-to-one class name="指定对一方的引用,实际上就是一方引用定义的属性" class="一方对应的持久化类,即关联实体类,全类名" cloumn="外键的列名" ></many-to-one>
(注意:无需在一方添加关联映射,即set元素)
三、inverse属性和cascade属性
inverse属性:
1、一方的hbm.xml文件的<set>节点的inverse属性指定了关联关系的控制方向,默认由one方来维护;
2、关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系;
3、在一对多关联中,设置one方的inverse为true,这将有助于性能的改善。
cascade属性:
1、当设置了cascade属性不为none时,Hibernate会自动持久化所关联的对象;
2、cascade属性的设置会带来性能上的变动,需要谨慎设置;
————————————————————————————
属性值 含义和作用
all 对所有操作进行级联操作
save-update 执行保存和更新操作时进行级联操作
delete 执行删除时进行级联操作
none 对所有操作不进行级联操作
————————————————
说明:举个例子,见截图:
在向Grade添加Student后,保存Grade对象时,能不能不需要显示的保存Student对象,答案是可以的,可以使用级联操作:在Grade的映射文件中的<set>节点添加cascade属性不为none,为"save-update".