关于hibernate的一些基础知识

这篇博客探讨了使用Hibernate进行持久化操作的基本步骤,包括PO对象的三种状态,以及在关联映射中控制权的重要性。特别是强调在<one-to-many>关系中,将控制权赋予many的一方。此外,还提到了双向关联的设置,如mappedBy属性的使用,以及fetch和cascade策略的影响。在一对多关系中,通常设置lazy加载,而在多对一关系中,可能选择eager加载以优化性能。

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

SessionFactory一般只要产生一个(所以用单例比较好),除非要访问多个数据库
sessionFactory的两个方法(openSession和getCurrentSession):
openSession()每次都是新的session,需要close()
getCurrentSession()从上下文找,如果有,用旧的,如果没有,建新的
1、用途:界定事务边界
2、事务提交自动close
3、current_session_context_class(jta thread)(java transaction api)
如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,
也就是不用再session.close()了。但是如果使用的是openSession方法创建的session的话,
那么必须显示的关闭session,也就是调用session.close()方法。这样commit后,session并没有关闭


使用Hibernate进行持久化操作,通常进行如下操作步骤:

1、开发持久化类,由POJO加映射文件组成
2、获取Configuration。
3、获取SessionFactory。
4、获取Session,打开事务。
5、用面向对象的方式操作数据库。
6、关闭事务,关闭Session。


PO的三种状态

随PO与Session的关联关系,PO有三种状态:瞬态、持久化、脱管。
transient:内存中一个对象,没id,缓存中也没有
persistent:内存中有,缓存中有,数据库有id
detached:内存中有,缓存没有,数据库有,ID

Hibernate中save()和persist()方法之间的区别
Hibernate 之所以提供与save()功能几乎完全类似的persist()方法,一方面是为了照顾JPA的用法习惯。另一方面,save()和 persist()方法还有一个区别:使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);但使用 persist() 方法来保存持久化对象时,该方法没有任何返回值。因为 save() 方法需要立即返回持久化对象的标识属性,所以程序执行 save() 会立即将持久化对象对应的数据插入数据库;而 persist() 则保证当它在一个事务外部被调用时,并不立即转换成 insert 语句(persist 在事务外部调用时则不会立即执行 insert 语句,在事务内调用还是会立即执行 insert 语句的), 这个功能是很有用的,尤其当我们封装一个长会话流程的时候,persist() 方法就显得尤为重要了。
主要内容区别:
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert
事务外的 persist 是为了应对长事务,事务内的 persist 是为了和 save 保持一个语义。

单向关联双向关联的区别

单向是用hql查询时只能从一方得到另一方的信息,双向则是从另一方也能得到这一方的信息,但在数据库里,是没有区别的。
举个例子:有个user表,还有个group表,它们是多对一关系。在数据库里,user表会有一个group_id字段,是个外键,用来指向group表的id,但在实体类里,如果你只配了多对一单向,即只配置了user表里的多对一关系,那你查询的时候可以这样查,select u.group from User u where u.name="张三",但你不能这样查 ,select g.users from Group g where g.name="管理员" 。 如果你设置了双向关联,则这两种写法都可以查。

关联的时候还涉及的就是控制权的问题,在<one-to-many>最好把控制权给与many的那方(控制权就是谁来维护他们之间的关系)


双向程序要在程序中设好双向关联。

双向要设定mappedBy


fetch管读取

cascade管增删改,一般情况下一对多时设lazy(多这一方比较少时可以直接eager全部都取出来放在缓存里),多对一时设eager




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值