A. hibernate 中怎么执行update操作
首先你要知道,hibernate的update操作的运行机理:
hibernate的update是怎么样自动的进行update操作的呢?
首先hibernate先会执行一个select操作,到数据库中查找
当前要update操作的对象的主键是否存在,类似于:
select id from table where id=XXX
如果查找到了改id,就说明该对象是一个持久化对象,
如果该对像的某些属性变化了,hibernate就会自动的执行update操作,
同步数据库中的该对象。
如果hibernate没有查找到该id,就说明该对象是一个游离的对象,
hibernate就会执行insert操作。
根据这些,就可以找找是不是要update的对象的id在数据库中不存在,
或是更改的该对象的id。这些都是执行insert而不是update
B. hibernate query.list()得到的用户属性与数据库不同步
事物管理配置问题,出现了幻读或脏读现象。看看事物管理的配置
C. hibernate二级缓存数据同步问题,当数据存入二级缓存,当需要修改数据的时候怎么做
没有新数据的时候直接用缓存中数据查询,要更新表里数据的时候更新缓存
D. hibernate缓存怎么与数据库保持同步
重新执行query
E. 用hibernate的getcurrentsession() 造成了数据库和查询的不同步,是怎么回事
如果你使用getcurrentsession();
需要在hibernate.cxf.xml里面配置一条
<property name="current_session_context_class">thread</property>
用以使用本地事务。
希望对你有帮助。
F. hibernate中查询的数据与数据库不同步问题
你所看到的数据库没反映并不是说数据库没有进行任何的更改
而是数据同步的问题
就像你同时打开两个超作数据库的窗口
在其中一个插入数据,不commit,在另外的窗口就查询不出来
但是在插入窗口是可以查询出来的
hibernate就像是你开的第二个窗口
当然楼上说的很对不修改数据库的数据是不会存在数据不同步的说法的。
这不是hibernate本身的问题哦
建议你看下数据库的知识哦
另外,站长团上有产品团购,便宜有保证
G. hibernate工作原理及为什么要用
hibernate 简介:
hibernate是一个开源框架,它是对象关联关系映射的框架,它对JDBC做了轻量级的封装,而我们java程序员可以使用面向对象的思想来操纵数据库。
hibernate核心接口
session:负责被持久化对象CRUD操作
sessionFactory:负责初始化hibernate,创建session对象
configuration:负责配置并启动hibernate,创建SessionFactory
Transaction:负责事物相关的操作
Query和Criteria接口:负责执行各种数据库查询
hibernate工作原理:
1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory
4.Session session = sf.openSession();//打开Sesssion
5.Transaction tx = session.beginTransaction();//创建并启动事务Transation
6.persistent operate操作数据,持久化操作
7.tx.commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
为什么要用hibernate:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Hibernate是如何延迟加载?get与load的区别
1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据 库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本(bibernate3.2以上)中get方法也会查找二级缓存!
2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:
(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
(2)若为false,就跟Hibernateget方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
这里get和load有两个重要区别:
如果未能发现符合条件的记录,Hibernate get方法返回null,而load方法会抛出一个ObjectNotFoundException。
load方法可返回没有加载实体数据的代 理类实例,而get方法永远返回有实体数据的对象。
(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正 确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加 载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数 据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)
总之对于get和load的根本区别,一句话,hibernate对于 load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方 法,hibernate一定要获取到真实的数据,否则返回null。
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
说下Hibernate的缓存机制:
Hibernate缓存的作用:
Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据
Hibernate缓存分类:
Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存
Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。
Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。
什么样的数据适合存放到第二级缓存中?
1 很少被修改的数据
2 不是很重要的数据,允许出现偶尔并发的数据
3 不会被并发访问的数据
4 常量数据
不适合存放到第二级缓存的数据?
1经常被修改的数据
2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
3 与其他应用共享的数据。
Hibernate查找对象如何应用缓存?
当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存
删除、更新、增加数据的时候,同时更新缓存
Hibernate管理缓存实例
无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。
当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。
Hibernate的查询方式
Sql、Criteria,object comptosition
Hql:
1、 属性查询
2、 参数查询、命名参数查询
3、 关联查询
4、 分页查询
5、 统计函数
如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存撑腰
hibernate的开发步骤:
开发步骤
1)搭建好环境
引入hibernate最小的jar包
准备Hibernate.cfg.xml启动配置文件
2)写实体类(pojo)
3)为实体类写映射文件"User.hbm.xml"
在hibernate.cfg.xml添加映射的实体
4)创建库表
5)写测试类
获得Configuration
创建SessionFactory
打开Session
开启事务
使用session操作数据
提交事务
关闭资源
H. 用hibernate的getcurrentsession() 造成了数据库和查询的不同步,是怎么回事
我个人觉得是你这里的getcurrentsession没有提交事务,导致执行了更新操作 但实际底层没有提交事务,意思就是说最终没有进行commit 而不是你说的线程延迟什么问题。
getcurrentsession()和opensession() 的区别重点不是在于线程问题,而是管理事务回滚问题。
比如你用getcurrentsession取了当前session,当你循环List对象并更新每个对象里的一个字段时报了错误,那很多项目中根据公司需求得进行回滚,比如回滚整个List对象,或者回滚当前这一个对象并继续更新下一个对象等。当你用当前session了说明你的每个对象对应的每个事物都被一个session管理,而用了opensession说明你的每个对象每次开启了新session 不但占用了很多资源,而且每个session对应一个事务。大多数情况都是封装用getcurrentsession因为每次逻辑都用一个session来管理 也不占资源。
每次取session时候底层都用的是sessio。load方法,这个方法 就跟hibernate懒惰加载有关系,就比如楼上说的改成lazy=false 但这个也不建议改,如果用了lazy=false了说明勤奋加载 那样程序负担太大。
自从用了spring开始,线程安全,同步都归spring的ThreadLocal管理,用的是临时线程变量机制,一般不会出现并发报错问题。
希望对你有所帮助
I. java框架hibernate的实体对象有哪三种状态以及这三种状态下,对实体进行修改会不会同步到数据库里
1. 瞬时状态: 当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态。自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。
2. 持久状态: 持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。
3. 脱管状态:当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中 可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。
脱管状态的实体信息不会同步到数据库,而是会从数据库中返回该持久化状态
在持久状态下,该实体对象的任何修改,都会同步到数据库中。
J. Hibernate的具体执行流程是怎样的
先说下hibernate工作原理:
对数据库的写操作包括保存、更新和删除,当保存一个POJO持久对象时,触发Hibernate的保存事件监听器
进行处理。Hibernate通过映射文件获得对象对应数据库表名以及属性所对应的表中的列名,然后通过反射机制
持久化对象(实体对象)的各个属性,最终组织成向数据库插入新对象的SQL insert语句。调用了
session.save()方法后,这个对象会标识成持久化状态存放在session中,对于Hibernate来说它就是一个持久化
了的对象,但这个时候Hibernate还不会真正的执行insert语句,当进行session的刷新同部或事务提交时,
Hibernate会把session缓存中的所有SQL语句一起执行,对于更新、删除操作也是采用类似的机制。
然后,提交事务并事务提交成功后,这些写操作就会被永久地保存进数据库中,所以,使用session对数据
库操作还依赖于Hibernate事务的处理。如果设置了二级缓存,那么这些操作会被同步到二级缓存中,Hibernate
对数据库最终操作也是依赖于底层JDBC对数据库进行