3. Hibernate是什么? 在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架; Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架; Hibernate是对JDBC API的封装,是JDBC轻量级封装框架。 4. Hibernate需要从配置文件中读取数据库配置信息,配置文件一般位于项目根路径。 Hibernate配置文件两种方式: hibernate.properties (键=值方式) 默认名字为:hibernate.propeties hibernate.cfg.xml 一般推荐使用第二种 5. hibernate.cfg.xml的具体配置信息
<?xml version="1.0" encoding="UTF-8"?> <!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义, XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件--> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!--Hibernate配置文件的根元素,其他文件要包含在其中--> <hibernate-configuration> <!--SessionFactory是Hibernate中的一个类,这个类主要负责保存Hibernate的配置信息,以及对session的操作--> <session-factory> <!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。--> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序,8.0版本的MySQL要在mysql和jdbc之间加上cj--> <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property> <!--设置数据库的连接url:jdbc:mysql://localhost:3306/dbname,其中localhost表示mysql服务器名称,此处为本机, dbname是数据库名--> <!--与之前使用的版本不同,8.0要加上时区的配置,且中间都要使用&隔开,如果是直接在servlet里面写连接路径,则不需要写&只需要一个&隔开就好 --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/anno?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property> <!-- 连接数据库时数据的传输字符集编码方式 --> <property name="hibernate.connection.characterEncoding">UTF-8</property> <!--连接数据库时的用户名--> <property name="hibernate.connection.username">root</property> <!--连接数据库时的密码--> <property name="hibernate.connection.password">1234</property> <!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错, 程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率--> <property name="hibernate.show_sql">true</property> <!-- 格式化输出的Sql语句 --> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <!--指定映射文件,可映射多个映射文件,一个类规范写有一个映射文件--> <mapping resource="com/ddd/entity/Course.hbm.xml"/> <mapping resource="com/ddd/entity/Student.hbm.xml"/> <mapping resource="com/ddd/entity/Score.hbm.xml"/> </session-factory> </hibernate-configuration> 持久化类:指其实例需要被Hibernate持久化到数据库中的类即实体类 private 类型属性; public 类型的 setter 和 getter 方法; public 或 protected 类型的无参数的构造方法。描述持久化类与数据库表之间的对应关系。 持久化类的配置文件 class元素用于指定类和表之间的映射。 name属性设定类名(包含路径); table属性设定表名,默认以类名作表名。 class元素包含一个id子元素及多个property子元素。 id 子元素设定持久化类的OID和表的主键的映射关系。 column – 指定表字段的名称; generator – 元素指定OID的生成器。property 子元素设定类的其他属性和表的字段的映射关系。 name – 对应类的属性名称; type – 指定属性的类型; column – 指定表字段的名称; not-null – 指定属性是否允许为空。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- packge对应持久化类的包名 --> <hibernate-mapping package="com.ddd.entity"> <class name="Course" table="course"> <!-- id 和 property 元素不能颠倒位置 --> <id name="id" column="id"> <!-- 主键生成策略 使用native,需要底层数据库自己设置主键的值哦,比如AUTO_INCREMENT --> <generator class="identity"> </generator> </id> <property name="name" column="name"></property> <property name="credit" column="credit"></property> <!-- 一个课程关联多个学生 --> <!-- 使用set来描述在一的一方中关联的多,也即Set<Orders> 它的name属性就是Set集合的名称:orders key:它主要描述关联的多的一方产生的外键名称,注意要与多方定义的外键名称相同 inverse属性: 默认为false,表示本方维护关联关系。 如果为true,表示本方不维护关联关系。 只是影响是否能设置外键列的值(设成有效值或是null值),对获取信息没有任何影响。 cascade属性: 默认为none,代表不级联。 级联是指操作主对象时,对关联的对象也做相同的操作。 可设为:delete,save-update,all,none,... one-to-many:主要描述集合中的类型 cascade="all" --> <set name="stu" table="score" inverse="true"> <!--指的是本实体类在第三方表中外键的名称 --> <key column="cid"></key> <many-to-many class="Student" column="stuid" /> </set> </class> </hibernate-mapping>主键必须满足的条件: 不允许null; 每条记录必须有唯一的主键值,主键值不能重复; 每条记录的主键值不能改变。 主键分类: 业务(自然)主键:具有实际意义; 代理主键:没有实际意义。(我们使用的id就属于代理主键)
OID 是关系数据库表中的主键(通常是代理主键)在 Java 对象模型中的等价物; Hibernate 采用 OID 来维持Java持久化类和数据库表中对应关系;
Hibernate 允许在持久化类中把OID定义为以下三种类型: Short、Integer、Long;为了保证 OID 的唯一性,通常由 Hibernate 或底层数据库给 OID 赋值。
在对象-关系映射配置文件中class元素的子元素用来设置 OID。 generator子元素用来指定OID的生成器。
increment 标识符:该机制是 Hibernate 以递增的方式为OID赋值。不依赖于底层数据库系统,适合所有数据库;适合单独的 Hibernate 应用使用,不适合在集群情况下使用。 identity 标识符: 该机制依赖于底层数据库,需要数据库支持自动增长字段。//把数据库原有的id删除了,它只会在已删除的id上自动增长,如果数据有id大于已删除的字段则在最大的id上增长,如果删除的是最大的id,则以已删除的最大id增长,比如删掉了id为5、6的数据,数据库中目前最大是4,则下一条id是7而不是5 assigned 标识符: 该机制是由外部程序负责生成 OID, Hibernate 不负责维护主键生成,与Hibernate和底层数据库都无关。需要自己在程序中设值;例如: Student 类没有定义 ID,而是以学号 studentNo 作为业务主键。 然后在程序中set.studentNo();设置id的值;
