配置Hibernate有2种方式,本文讲的是通过外部配置文件配置的方式
Hibernate核心配置文件
1 <?xml version='1.0' encoding='UTF-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!--1.配置数据源--> 8 <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> 9 <property name="connection.url">jdbc:oracle:thin:@localhost:1521:mytest</property> 10 <property name="connection.username">sys</property> 11 <property name="connection.password">sys</property> 12 <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 13 <!--是否打印Hibernate生成的sql语句--> 14 <property name="show_sql">true</property> 15 <!-- 2.引入映射文件 --> 16 <!-- <mapping package="com.accp.hbm.xml"/> 批量引入 --> 17 <mapping resource="com/jazz7/hbm/xml/Users.hbm.xml" /><!--逐个引入--> 18 </session-factory> 19 </hibernate-configuration>
Hibernate核心配置文件中主要配置2个东西
1:数据源,其中各个属性直接看单词字面意思即可;还有Hibernate一些行为设置,比如是否显示生成的sql语句、是否格式化sql语句之类的
2:引入Hibernate映射文件,可以批量引入以及逐个引入。映射文件一定要在这里引入,否则是没有任何作用的。
Hibernate映射文件
1.最简单的配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 1.package的值是此映射文件对应的实体类的包名 --> <hibernate-mapping package="com.jazz7.entity"> <!-- 2.配置实体类,如果实体类的名称和数据库中的表名称不同的话,则这里需要指定表名table="表名" --> <class name="Student" table="tbl_Student"> <!-- 3.指定主键,主键需要用id节点指定,和表名一样,如果主键或字段名和实体类中的属性名不同的话,可以使用column属性指定数据库表中的字段名称 --> <id name="sid" > <!-- 4.指定主键的生成方式,sequence是以序列的方式生成,还有其他的指定方式,比如increment,自动生成--> <generator class="sequence" > <!-- 5.指定已经创建好的序列名称 --> <param name="sequence">seq_student_id</param> </generator> </id> <!-- 6.普通属性 --> <property name="sname" /> </class> </hibernate-mapping>
Hibernate映射文件主要是将实体类和数据库中的表进行映射匹配,其中有2个注意点
1:定义主键的时候有多种生成方式,需要根据不同的数据库来分别制定,比如oracle需要用序列,mysql需要用identity。
2:如果表名或字段名和实体类中定义的不一样的话,需要额外在配置文件中说明。
2.多对一配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jazz7.entity"> <class name="Emp" table="emp"> <id name="empno" column="empno"> <generator class="increment" /> </id> <property name="ename" /> <property name="job" /> <property name="mgr" /> <property name="hiredate" /> <property name="sal" /> <property name="comm" /> <!-- 多对一配置 --> <!-- 需要将实体类中相关基本类型属性改为外键对应的实体类类型 --> <!-- name指的是此实体类中的对应属性名称 --> <!-- column指的是外键名称 --> <!-- class指的是外键对应的实体类 --> <many-to-one name="dept" column="deptno" class="Dept" /> </class> </hibernate-mapping>
3.一对多配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jazz7.entity"> <class name="Dept" > <id name="deptno"> <generator class="increment" /> </id> <property name="dname" /> <property name="loc" /> <!-- 一对多配置 --> <!-- cascade的意思是级联操作,比如这里配置了delete,那么删除一的一方的时候,会将此“一”关联的所有的多的一方都删除掉 --> <!-- inverse的意思是控制反转,这里配置了true,表示将控制权交给另一方,如果是false的话,则表示将控制权交给自己 --> <!-- lazy的意思是延迟加载,就是如果读取一的一方的数据的时候是否将多的一方的数据也都读出来 --> <set name="emps" cascade="delete" inverse="true" lazy="extra" > <!-- 配置主键 --> <key column="deptno" /> <!-- 配置多的一方的实体类 --> <one-to-many class="Emp" /> </set> </class> </hibernate-mapping>
4.多对多配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jazz7.entity"> <class name="Student" table="tbl_Student"> <id name="sid" > <generator class="sequence" > <param name="sequence">seq_student_id</param> </generator> </id> <property name="sname" /> <!-- 多对多配置 --> <set name="teachers" table="tbl_teacher_student"> <key column="sid" /> <many-to-many class="Teacher" column="tid" /> </set> </class> </hibernate-mapping>
多对多这种关系比较特殊,它主要用在那种需要将关联关系抽出来放在一个新的表中的场合。
可能说的不清楚,举个例子吧(共享单车)。
现在有两个表,一个是单车信息表,一个是用户信息表。
一个单车可能被多个用户骑过,一个用户也可能骑过多个单车。那么此时,主外键关系就不能满足我们的需求了,我们可以创建一个新的表,“单车_用户关联表”,这个表中只有3个字段,分别是id,单车id,用户id。
就是将单车和用户的关系抽出来,放在一个新的表中。