微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

*.hbm.xml文件――单表映射、双向多对一以及多对多的配置

这是单表映射的配置:

Student.hbm.xml

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
MappingfileautogeneratedbyMyEclipsePersistencetools
-->
<hibernate-mapping>
<classname="com.model.Students"table="students"catalog="hibernate">
<idname="sid"type="java.lang.Integer">
<columnname="sid"/>
<generatorclass="assigned"/>
</id>
<propertyname="name"type="java.lang.String">
<columnname="name"length="50"/>
</property>
<propertyname="gender"type="java.lang.String">
<columnname="gender"length="50"/>
</property>
<propertyname="birthday"type="java.util.Date">
<columnname="birthday"length="10"/>
</property>
<propertyname="address"type="java.lang.String">
<columnname="address"length="200"/>
</property>
</class>
</hibernate-mapping>

配置双向一对多或者双向多对一的配置:

Grade.hbm.cml

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<classname="com.imooc.entity.Grade"table="grade">
		<idname="gid"column="gid"type="java.lang.Integer">
			<generatorclass="increment"/>
		</id>
		<propertyname="gname"type="java.lang.String">
			<columnname="gname"length="20"not-null="true"/>
		</property>
		<propertyname="gdesc">
			<columnname="gdesc"/>
		</property>
			<!--配置一对多关联关系设置inverse属性为true,表示由多方进行关联关系的维护,当进行保存和更新时级联操作所关联的对象-->
		<setname="students"table="student"inverse="true"cascade="save-update">
			<!--指定关联的外键列-->
			<keycolumn="gid"/>
			<one-to-manyclass="com.imooc.entity.Student"/>
		</set>
	</class>
</hibernate-mapping>

Student.hbm.xml

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<classname="com.imooc.entity.Student"table="student">
		<idname="sid"column="sid"type="java.lang.Integer">
			<generatorclass="increment"/>
		</id>
		<propertyname="sname"type="java.lang.String">
			<columnname="sname"length="20"not-null="true"/>
		</property>
		<propertyname="sex">
			<columnname="sex"/>
		</property>
		<!--配置多对一的关联关系-->
		<many-to-onename="grade"class="com.imooc.entity.Grade"column="gid"cascade="all"></many-to-one>
	</class>
</hibernate-mapping>

配置多对多关联关系的配置,数据库中有三个表project,employee,proemp(关联表)

Project.hbm.xml

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<classname="com.imooc.entity.Project"table="project">
		<idname="proid"column="proid"type="java.lang.Integer">
			<generatorclass="assigned"/>
		</id>
		<propertyname="proname"type="java.lang.String">
			<columnname="proname"length="20"not-null="true"/>
		</property>
		<!--配置多对多的关联关系-->
		<setname="employees"table="proemp"cascade="all">
			<keycolumn="rproid"></key>
			<many-to-manyclass="com.imooc.entity.Employee"column="rempid"></many-to-many>
		</set>
		
	</class>
</hibernate-mapping>

Employee.hbm.xml

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<classname="com.imooc.entity.Employee"table="employee">
		<idname="empid"column="empid"type="java.lang.Integer">
			<generatorclass="assigned"/>
		</id>
		<propertyname="empname"type="java.lang.String">
			<columnname="empname"length="20"not-null="true"/>
		</property>
		
		<!--配置多对多的关联关系-->
		<setname="projects"table="proemp"inverse="true">
			<keycolumn="rempid"></key>
			<many-to-manyclass="com.imooc.entity.Project"column="rproid"></many-to-many>
		</set>
	</class>
</hibernate-mapping>
/*
*多对多关联关系的配置
*同时建立了Project到Employee之间的双向关联关系
*关联关系的维护由Project方来处理(在Employee.hbm.xml中的<set>属性中设置inverse="true")
*并且在保存Project对象时会一并保存Employee对象
*/


Hibernate的Generator属性有7种class,本文简略描述了这7种class的意义和用法

1、identity:用于MysqL数据库。特点:递增

<idname="id"column="id">
<generatorclass="identity"/>
</id>

注:对于MysqL数据库使用递增序列时需要在建表时对主键指定为auto_increment属性

2、sequence:用于Oracle数据库

<idname="id"column="id">
<generatorclass="sequence">
<paramname="sequence">序列名</param>
</generator>
</id>

3、native:跨数据库时使用,由底层方言产生。

Default.sequence为hibernate_sequence

<idname="id"column="id">
<generatorclass="native"/>
</id>

注:使用native时Hibernate认会去查找Oracle中的hibernate_sequence序列。

如果数据库中没有该序列,连接数据库时会报错。

4、hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要有初始值。

<idname="id"column="id">
<generatorclass="hilo">
<paramname="table">high_val</param>
<paramname="column">nextval</param>
<paramname="max_lo">5</param>
</generator>
</id>

5、sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。

<idname="id"column="id">
<generatorclass="hilo">
<paramname="sequence">high_val_seq</param>
<paramname="max_lo">5</param>
</generator>
</id>

6、assigned:用户自定义id;

<idname="id"column="id">
<generatorclass="assigned"/>
</id>

7、foreign:用于一对一关系共享主健时,两id值一样。


当设置了cascade属性不为none时,Hibernate会自动持久化所关联的对象

cascade属性的可能值有

all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。

all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。

原文地址:https://www.jb51.cc/xml/295006.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。