一、主配置文件hibernate.cfg.xml再抽取(抽取连接数据库的驱动、url、用户名及密码放到hibernate.properties文件中)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 抽取连接数据库的驱动、url、用户名及密码放到hibernate.properties文件中 --> <!-- <property name="hibernate.connnection.driver">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///db_test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <mapping resource="edu/aeon/beans/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
hibernate.properties文件如下:
hibernate.connnection.driver=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql:///db_test
hibernate.connection.username=root
hibernate.connection.password=root
需要注意:这种方式抽取的配置文件必须将hibernate.properties文件放到src下、其它任何地方不许修改。执行的优先级是hibernate.cfg.xml、hibernate.properties文件(先去hibernate.cfg.xml找有没有连接数据库的配置信息,如果没有再去src下找hibernate.properties)
二、连接池
在hibernate.cfg.xml配置文件中我们可以配置数据库连接池来加快服务器连接数据库的响应速度、如果我们不配置连接池,则hibernate为我们提供了内置的连接池(不要用在产品中)。
三、hibernate中常用的主键生成策略
3.1increment生成策略
该策略是Hibernate自己在维护主键的值。当准备在数据库表中插入一条新纪录时,首先从数据库表中获取当前主键字段的最大值(该策略下每次向数据库插入数据前都会跑一条select max(id) from 表名的sql),然后在最大值的基础上加1作为新插入记录的主键值。
该策略生成的主键字段所对应的属性类型可以是long、short、int及其封装类的类型。这种策略只有在没有其它进程向同一张表中插入数据时才能使用。在高并发下或者集群下不能使用。
3.2identity生成策略
该策略使用数据库自身的自增长来维护主键值。对应到mysql中相当于使用auto_increment来维护。用其生成的主键字段所对应的属性类型可以是long、short、int及其封装类。
3.3sequence生成策略
在oracle、DB2和PostgreSQL等数据库中创建一个序列(sequence),然后Hibernate通过该序列为当前记录获取主键值,从而为实体对象赋予主键字段映射属性值。此即sequence生成策略,用其生成的主键字段映射属性值的类型可以是long、short、int及其封装类。插入数据前获取hibernate_sequence表中next_val的值作为主键、插入后将修改该字段+1操作。
对于mysql数据库,原本是不支持序列的。但是稍作修改(将hibernate_squence表里面的字段初始化)后,mysql也支持该生成策略。hibernate 5版本之后自动支持该主键生成策略,不需要我们修改了!
3.4native生成策略
由hibernate根据所使用的数据库能力从identity(mysql)、sequence(oracle)生成策略中选择一种。如果你连接的是mysql数据库,则主键生成策略为identity、如果你连接的是oracle数据库,则主键成成策略为:sequence、原理同操作文件时为了解决跨平台而设计的文件名分隔符(file对象的separator)、windows() linux等其它为(/)。而这里目的是为了跨数据库。
使用这种生成策略可以根据不同的数据库采用不同的主键生成策略,该策略主要是为了便于hibernate应用在不同数据库之间的移植。
3.5.assigned生成策略
该生成策略的主键值来自于程序员的手工设置,即通过setId()方法设置。属性类型可以是整型,也可以是String,但一般为String。此生成策略主要应用于业务相关主键。例如学号、身份证号做主键。大家都知道人工设置出错的几率会很大、这就是为什么现实生活中有很多人的身份证号码是重复的。
3.6uuid生成策略
uuid生成策略采用uudi(universally unique identifier,通用唯一识别码)算法来生成一个字符串类型的主键值,该值使用ip地址、jvm的启动时间(精确到1/4秒)、当前系统时间和一个计数值(在当前的jvm中唯一)经过计算产生,可以用于分布式的hibernate应用 中。产生的标识符属性是一个32位长度的字符串。使用这种生成策略要求属性的类型必须为String类型。
这种标识符属性生成策略生成的数值可以保证多个数据库之间的唯一性,并且由于其省省与具体的数据库没有关系,所以其移植性较强。但由于该值是32位长的字符串,所以占用的数据库空间较大,并且检索速度较慢。不过,实际开发中使用这种生成策略较多。
除了使用hibernate外,在jdbc中也可以使用uuid生成主键。因为uuid是java.util包中的一个独立类。可以打开项目的JRE System Libary库中的rt.jar,在其中找到java.util包,即可看到uuid这个类。
使用uuid生成的数据。
varchar()长度最好定义为32位,也就是在实体类属性到数据库表字段的映射中指定其length=32即可。
使用uuid主键生成策略、主键必须被定义为String类型。