1.
#hibernate.hbm2ddl.auto create-drop 程序启动,hibernate初始化的时候,删掉表,创建表;程序运行结束后把所有表删掉。
#hibernate.hbm2ddl.auto create 程序启动,在创建表前会把表删掉。当虚拟机退出的时候(在hibernate退出的时候),它不会删表 (和上一种通常在测试环境下使用)
#hibernate.hbm2ddl.auto update 如果不一致,会更新一下表结构
#hibernate.hbm2ddl.auto validate 会校验映射文件跟表结构是否对应,如果不对应,不会update,而是报错。(这种方式更安全一些)
2.
Domain Object限制:
(1).必需要有一个无参构造函数
(2).有无意义的标示符id(主键)(可选)
(3).非final的,对懒加载有影响(可选)
3.
pubic final class HibernateUtil{
private static SessionFactory sessionFactory;
private HibernateUtil(){}
static{
Configuration cfg = new Configuration();
cfg.configure(); //如果文件名不是hibernate.cfg.xml,则可写成cfg.configure("abc.xml");
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
(1).声明为final,因为HibernateUtil类不需要被继承
(2).HibernateUtil不想被new,所以可以把构造方法设为private
(3).虚拟机加载这个类的时候,会执行static里面的代码,而且只执行一次
标准的结构
public class Main {
public static void main(String[] args) {
User user = new User();
user.setBirthday(new Date());
user.setName("name");
addUser(user);
}
static void addUser(User user){
Session s=null;
Transaction tx=null;
try{
s=HibernateUtil.getSession();
tx=s.beginTransaction();
s.save(user);
tx.commit();
}catch(HibernateException e){
if(tx!=null){
tx.rollback();
throw e;
}finally{
if(s!=null){
s.close();
}
}
}
}
}
4. 未解决的疑问 15分钟左右,关于load的println (解决了?因为session关闭了?)
a.在hibernate.cfg.xml里,true可以在运行时,把sql打印出来
b.session的get和load方法的区别?
最大区别:load不会立刻去访问数据库(所以不会打印出select语句),当第一次使用时,才会去访问数据库。
load返回的是代理,不会立即访问数据库
load是懒加载
在代码 User user1 = (User)session.load(User.class, id);
if(user1 != null){} 中; user1是永远都不会是空的,即使id为-1213212(不存在),原理,在运行load方法时,会new一个User的子类
c.save和persist方法的区别:
save,persist保存数据,persist在事务外不会产生insert语句。
唯一区别: 在没开启事务的时候,save方法会运行insert语句插入数据,但是因为事务没开启,所以回滚了。
persist方法见到没开启事务,就不会插入数据。
Session的几个主要方法
1.save,persist保存数据,persist在事务外不会产生insert语句。
2.delete,删除对象
3.update,更新对象,如果数据库中没有记录,会出现异常。
4.get,根据ID查,会立刻访问数据库。
5.load,根据ID查,(返回的是代理,不会立即访问数据库)。
6.saveOrUpdate,merge(根据ID和version的值来确定是save或update),调用merge你的对象还是托管的。
7.lock(把对象变成持久对象,但不会同步对象的状态)
5.
对象状态
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。
持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;脱管对象状态发生改变,hibernate不能检测到
eg. session.save(user); user.setName("new name"); tx.commit;
结果,两条语句,一条insert,一条update。 说明处于持久状态的对象,他发生变化的时候,hibernate能知道
eg. session.save(user); user.setName("new name"); user.setBirthday(new Date()); tx.commit;
结果,两条语句,一条insert,一条update。 持久对象变化时不会立即更新数据库,而是等到commit时才做
hbm.xml文件中, unsaved-value可以不配,默认情况下,如果id是整数,则unsaved-value是0;如果id是String,则unsaved-value是空。 在保存时,hibernate会先读配置文件,如果配置了这个值,则比较,如果相等,则是瞬时的,就保存
分享到:
相关推荐
滴水逆向培训基础教程1-5章(内部资料)滴水逆向培训基础教程1-5章(内部资料)滴水逆向培训基础教程1-5章(内部资料)滴水逆向培训基础教程1-5章(内部资料)滴水逆向培训基础教程1-5章(内部资料)滴水逆向培训...
全国1-5级水系矢量数据是一份详尽的地理信息资源,涵盖了中国境内的主要河流、湖泊等水体信息。这份数据集是GIS(地理信息系统)领域的重要素材,通常用于环境研究、城市规划、水利管理、灾害预警等多个方面。 在...
电压电流转换1-5v转4-20mA Proteus仿真图
1. **中国1-5级河流**: 中国的河流分级是基于它们的长度和流量,1级河流为最大,如长江和黄河。这些数据提供了河流的位置、流向和等级信息,对于水资源管理、洪水预警、水利工程建设以及环境研究都至关重要。GIS...
全国 1-5 级河流 gis 地图shp,xml,shx,dbf文件 全国 1-5 级河流 gis 地图shp,xml,shx,dbf文件 全国 1-5 级河流 gis 地图shp,xml,shx,dbf文件
centos7下centos-release-openstack-mitaka
史上最强大又低成本的多屏策略!让iPad化身高分副屏的Duet Display!
基于CENTOS8平台,bc指令的安装包
安装oracle的时候使用的依赖包,针对linux7以上有效。
在Linux系统Ubuntu中安装数据库Oracle11g缺乏的依赖包
最新ISO 16750-2023打包1-5,中文,道路车辆-电气及电子设备的环境条件和试验 ISO 16750-1,2023 道路车辆-电气及电子设备的环境条件和试验- 一般规定 ISO 16750-2,2023 道路车辆-电气及电子设备的环境条件和试验 - ...
1-5次-Python基础.ppt
deepl-1-5.apk.1
AgGlUAD_S-1-5-21-2568961307-4241727450-1480478662-500
应用多元统计分析-1-5章 应用多元统计分析-1-5章 应用多元统计分析-1-5章
067.3.5-综合1-5.sz
NVM-Express---SCSI-Translation-Reference-1-5-20150624-Gold 使用SCSI访问NVME接口的转换标准,详细定义了各种SCSI指令与NVME指令的对应关系
它由五个部分组成,分别是:ISO16750-1(一般要求)、ISO16750-2(电气负荷)、ISO16750-3(机械负荷)、ISO16750-4(气候负荷)以及ISO16750-5(化学负荷)。这些标准主要针对汽车制造商和供应商,旨在确保汽车电子...
包含11898所有文档1-5: ISO 11898-1-2003.pdf ISO 11898-2-2003.pdf ISO 11898-3-2006.pdf ISO 11898-4-2004.pdf ISO 11898-5-2007.pdf