单表操作
单一主键
(1)assigned 由java应用程序负责生成(手工赋值)
(2)native 由底层数据库自动生成标示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等
Ps1:assigned注意:如果实体类中设置的主键id是基本类型int的话,则可以不用赋值,系统默认值为0;如是引用类型Integer话,则默认值为null,不赋值系统则报错。
Ps2:native注意:系统会自动选择该数据库对应的自动增值方式,从1开始。即使手动给他赋值,也不会起作用,但也不会报错。
hibernates数据类型
特别关注date和timestamp类型
数据类型
Java中blob对象
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
在持久类中添加一个blob类型的picture,利用hibernate对数据库进行操作
@Test
public void testWriteBlob() throws Exception{
//先获得照片文件
File f=new File("C:\\Users\\john\\Pictures\\tag.jpg");
//获得照片文件输入流
InputStream input =new FileInputStream(f);
//创建一个Blob对象
Blob image=Hibernate.getLobCreator(session).createBlob(input, input.available());
//设置照片属性
user user=new user();
user.setId(1);
user.setPassword("rose");
user.setUsername("rose");
user.setPicture(image);
//保存
session.save(user);
}
**记得把配置文件中的
<property name="hbm2ddl.auto">update</property>
**
改成update
这段代码会在原有的数据表的基础上更新数据表,添加一个字段名为picture的longblob类型的对象。
可以再写一个测试方法用来读取该图片是否已经写进数据库中
@Test
public void testReadBlob() throws Exception{
user user=(user)session.get(user.class, 1);
//获得Blob对象
Blob image=user.getPicture();
//获得照片输入流
InputStream input=image.getBinaryStream();
//创建输出流
File f=new File("C:\\Users\\john\\Pictures\\copytag.jpg");
//获得输出流
OutputStream output=new FileOutputStream(f);
//创建缓冲区
byte[] buff=new byte[input.available()];
input.read(buff);
output.write(buff);
input.close();
output.close();
}
如果在该路径下找到了文件名为copytag.jpg的文件,则表明该写入成功
-hibernate还有一种类型是组件属性
组件属性:实体类中的某个属性属于用户自定义类的对象;
作用:将两个实体类合并在一起组建成一个表;
在hbm.xml文件中配置:
格式:
<component name="取的名字" class="完整类名">
<property name="类中属性" column="对应生成数据库中列属性名">
</component>
完整类名:如果该类有包名,则需要加上包名,且用(.点 )来连接。
单表的CURD操作,即增删改查,会用到以下几个方法
1、save()
2、update()
3、delete()
4、get/load(查询单个记录)
get/load方法的区别
1.数据不存在,get方法返回null。
2.load方法,抛出ObjectNotFoundException
3.调用get方法后,直接发出sql语句,返回一个实体对象。
4.调用load方法后,返回一个代理对象,就是假的对象,里面只有实体对象的id存在,用到实体对象的其他属性时,才会发出sql获取一个完整的实体对象。
####openSession与getCurrentSession的区别?
1、前者每次都是创建新的session对象,而后者使用单例模式,每次创建都是相同的对象。openSession在使用完毕后需要显式地关闭,而getCurrentSession在事务提交之后会自动关闭。
2、他们都是来自于SessionFactory,如果使用getCurrentSession方法则需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<propertyname="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<propertyname="hibernate.current_session_context_class">jta</property>