hibernate多表关联总结
??????? ?<id name="userid" type="java.lang.Integer">
??????????? ??<column name="userid" />
??????????? ??<generator />
??????? ?</id>
??????? ?<property name="username" type="java.lang.String">
??????????? ??<column name="username" length="20" />
????????? </property>
????????? <one-to-one name="card" cascade="all"></one-to-one>
????? </class>
? </hibernate-mapping>
? 添加:<one-to-one name="card"
???????? />
? <class>元素的lazy属性为true,表示延迟加载,如果lazy设为false,则表示立即加载.以下对这二点进行说明.
??? 立即加载:表示在从数据库中取得数据组装好一个对象后,会立即再从数据库取得数据组装此对象所关联的对象
??? 延迟加载:表示在从数据库中取得数据组装好一个对象后,不会立即从数据库中取得数据组装此对象所关联的对象,
??????? 而是等到需要时,才会从数据库取得数据组装此关联对象.
? <one-to-one>元素的fetch属性可选为select和join
??? join:连接抓取,Hibernate通过在Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合.
??? select:查询抓取,Hibernate需要另外发送一条select语句抓取当前对象的关联实体或集合.
??? ******所以我们一般用连接抓取<join>
证件表:
<hibernate-mapping>
??? <class name="org.wen.beans.Card" table="card" lazy="true" catalog="study">
??????? <id name="cardid" type="java.lang.Integer">
??????????? <column name="cardid" />
??????????? <generator type="java.lang.Integer">
??????????? <column name="cardnum" />
??????? </property>
??????? <one-to-one name="user" constrained="true"></one-to-one>
? <!-- constrained="true"表示card引用了student的主键作为外键。 -->
??? </class>
</hibernate-mapping>
一对一映射必须加载的元素有:
??????? name
??????? class
??????? constrained(主键关联)
??????? fetch(关联的一方才有:意思是说需要通过这一方查询另一方数据的一方.比如学生表查询证件中的数据,学生就是关联的一方)
??????? cascade(关联的一方才有:意思是说需要通过这一方保存或者更新数据对另一方也产生影响(另一方也保存或者更新了,比如保存学生信息,那么与学生相关联的证件信息也保存了))??????? <id name="cardid" type="java.lang.Integer">
??????????? <column name="cardid"/>
??????????? <generator type="java.lang.String">
??????????? <column name="cardnum" length="20" />
??????? </property>??????
?????? <many-to-one name="user" column="userid" unique="true"/>
?????? <!-- 惟一的多对一,如果被限制为唯一,实际上变成一对一关系了 -->
???????? <!-- unique设为true表示使用DDL为外键字段生成一个惟一约束。
???????????????? 以外键关联对象的一对一关系,其本质上已经变成了一对多的双向关联,
???????????????? 应直接按照一对多和多对一的要求编写它们的映射文件。当unique为
???????????????? true时实际上变成了一对一的关系。
???? ***这里需要强调一点的是<many-to-one>元素必须有column这一项,它表示这个这个表的外键是什么.注意,这里是表的外键,不是类的外键-->
??? </class>
</hibernate-mapping>
3>:<one-to-many>单身关联
??? 一对多关联分为单向一对多关联和双向一双多关联
??? 单向的一对多关联只需要在一方进行映射配置
??? 单身一对多关联:
<hibernate-mapping>
??? <class name="org.wen.beans.Customers" table="customers" catalog="study">
??????? <id name="id" type="java.lang.Long">
??????????? <column name="ID" />
??????????? <generator />
??????? </id>
??????? <property name="userName" type="java.lang.String">
??????????? <column name="userName" length="20" />
??????? </property>
??????? <set name="orders" table="orders" cascade="save-update" inverse="true">
??????????? <key column="customers_ID"></key>
??????????? <one-to-many insert和update设定是否对column属性指定的关联字段进行insert和update操作
??????????? update="false">
??? </many-to-one>
4>多对多关联:
??? 多对多关联时要建一个连接表查询
学生的映射文件
<hibernate-mapping>
??? <class name="org.wen.beans.Students" table="students" catalog="study">
??????? <id name="stuId" type="java.lang.Long">
??????????? <column name="stuID" />
??????????? <generator />
??????? </id>
??????? <property name="sname" type="java.lang.String">
??????????? <column name="sName" length="20" />
??????? </property>
??????? <set name="teachers" table="student_teacher_table" cascade="save-update" inverse="false">
??????????? <key column="stuID"></key>
???????????? <many-to-many column="teaID"></many-to-many>
??????? </set>
? ***对<key>元素的理解:
??????? 它的控制主要是通过stuID(外键)来完成,就是我们从student_teacher_table表中我们只要
??????? select * from student_teacher_table where stuID='该学生的ID',这样我们就可以得到它的教师的ID了
? ***对<many-to-many>的理解:
??????? 我们从student_teacher_table表中根据stuID拿到了与该stuID关联的teaID,
??????? 然后select * from teacher where teaID='前一步拿到的teaID'
??? </class>
</hibernate-mapping>
教师的映射文件
<hibernate-mapping>
??? <class name="org.wen.beans.Teachers" table="teachers" catalog="study">
??????? <id name="teaId" type="java.lang.Long">
??????????? <column name="teaID" />
??????????? <generator />
??????? </id>
??????? <property name="teaName" type="java.lang.String">
??????????? <column name="teaName" length="20" />
??????? </property>
??????? <set name="students" table="student_teacher_table" inverse="true">
??????????? <key column="teaID"></key>
??????????? <many-to-many column="stuID"></many-to-many>
??????? </set>
??? </class>
</hibernate-mapping>
???