Hibernate操作表单

本文介绍Hibernate中主键生成策略assigned与native的区别,并详细解释了如何在实体类中使用BLOB类型存储图片,包括写入和读取图片的过程。此外,还介绍了组件属性的概念及其配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单表操作

单一主键

(1)assigned 由java应用程序负责生成(手工赋值)
(2)native 由底层数据库自动生成标示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等
Ps1:assigned注意:如果实体类中设置的主键id是基本类型int的话,则可以不用赋值,系统默认值为0;如是引用类型Integer话,则默认值为null,不赋值系统则报错。
Ps2:native注意:系统会自动选择该数据库对应的自动增值方式,从1开始。即使手动给他赋值,也不会起作用,但也不会报错。

hibernates数据类型

hibernate数据类型对应的Java类型

特别关注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>

最后,总结一下开发Hibernate的步骤

(1)编写配置文档hibernate.cfg.xml
(2)编写实体类。注意:每一个实体类都要与数据库中的一张表一一对应,实体类的编写要遵循JavaBean的要求。
(3)生成对应实体类的映射文件并添加到配置文档中
(4)调用Hibernate API进行测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值