在我们的开发过程中,数据库的连接信息和映射文件信息还有hibernate 整个工程信息,只需要读取一次,以后直接使用就可以了。
不需要每一次操作都去读取数据库的连接信息和映射信息,缓存信息的设置。使用HibernateSessionFactory的好处是工程启动的时候,把这些固定的参数读到内存,以后操作不许再重复读取hibernate的一些参数设置。把hibernate的配置文件的设置采用hibernateUtil类做成一个工厂类,以后要连接数据库,直接在这个已经准备好了的所有连接信息和参数的工厂类中开启连接就OK了。
HibernateUtil:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration cfg=new Configuration().configure();
StandardServiceRegistry ssr=new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties()).build();
return cfg.buildSessionFactory(ssr);
}
catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
配置hibernate.cfg.xml:
- Format_sql—是否格式化sql语句
- hbm2ddl.auto
create-drop :加载hibernate时创建,退出时删除表结构,前提是关闭了sessionfactory
create: 每次加载hibernate,重新创建数据库表结构,如果以前有表,先删除,
在创建新表
update : 加载hibernate自动更新数据库结构。如果有表,直接使用,如果没有表
先创建在使用。如果*.hbm.xml文件与数据库表结构不一致,则更新表结
构
validate : 加载hibernate时,验证创建数据库表结构。如果*.hbm.xml文件与数据库表结构不一致,则抛出异常
*.hbm.xml配置
- Hibernate-mapping
常用属性:
page -指定一个包前缀,如果在class中没有指定类的全路径,就用这个包名
- Class
常用属性:
name – 实体类的类名
table – 被映射到数据库表的名称
select-before-update –设置hibernate在更新某个持久化对象之前,是否需要先执行一次查询,默认false
dynamic-insert – 当保存一个对象时,是否动态生成insert语句,insert语句包含所有取值不为null的字段
dynamic-update – 当更新一个对象时,是否动态生成update语句
注:如果类名和表名一致,则可以省略table
可以包含的常见子元素:
id – 主键定义
property – 属性定义
关系映射定义(一对多、多对一等)
generator
被映射的类必须要有一个id定义
主键类型
逻辑主键:没有意义的唯一标识符
业务主键:有意义的唯一标识符
注:通常使用逻辑主键
Hibernate使用generator类来生成主键
内置generator
Increment:由hibernate自动递增生成标识符,用于为long, short或者int类型生成唯一标识。
(不是由数据库的自动增长功能完成)
identity :自增,由数据库生成,返回的标识符是 long, short 或者int类型的,支持自增的数据库:DB2,Mysql,SQLServer,Sybase等,oracle不支持。
sequence :根据数据库序列生成标识符,返回的标识符,必须支持序列,是long, short或者 int类型的。
hilo :使用一个高/低位算法来高效的生成long, short 或者int类型的标识符。
uuid.hex/uuid :用一个128-bit的UUID算法生成32位字符串类型的标识符。
native :根据数据库的不同选择identity, sequence 或者hilo中的一个。
assigned :让应用程序在save()之前为对象分配一个标示符(自己定义主键)。
foreign :使用另外一个相关联的对象的标识符。和联合一起使用。自定义generator
实现IdentifierGenerator接口(如果需要传递参数,再实现Configurable接口)
- Property
name – 对应类的属性名称
type – 指定属性的类型,一般情况下可以不用指定,由hibernate自动匹配(可参考文档中的有关说明)
length – 指定长度
column – 指定属性所对应的数据库字段的名称,如果列名与属性名相同,该列可以省略