- 浏览: 1098642 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
skyesx:
这是2PC实现,更常用的是一个柔性事务的实现,可以参考http ...
Spring分布式事务实现 -
ddbird:
这第一句就不严谨“分布式事务是指操作多个数据库之间的事务”,显 ...
Spring分布式事务实现 -
呵呵6666:
基于互联网支付系统的微服务架构分布式事务解决方案http:// ...
Spring分布式事务实现 -
小黄牛:
写得不错,交流群:472213887
Spring分布式事务实现 -
jiaoqf321456:
这明明是用的apache的压缩,给ant.jar有半毛钱关系吗 ...
使用ant.jar进行文件zip压缩
hibernate中get和load的区别:
(1)load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,在用到对象中的
其他属性数据时才查询数据库,但是万一数据库中不存在该记录,只能抛ObjectNotFoundEcception异常
,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这
个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下
session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有
对应记录存在就可以使用load方法来实现延迟加载。
(2)get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓
存中查找,还没有就查数据库,数据库中没有就返回null。
动态改变数据的加载:
在配置文件里面可以用lazy=true,在程序里面可以用强制加载的方法Hibernate.initialize(Object
proxy) 方法强制加载这样就相当于动态改变为lazy=false。
需要注意的一点是:其中的proxy是持久对象的关联对象属性,比如A实体,你要把A的关
联实体B也检出,则要写Hibernate.initialize(a.b)。
附: Hibernate synchronizer映射oracle时,驱动及URL,用户名,密码都已填写好了,在Refresh时,出来的表是系统中所有的表,而不是用户所在表空间的用户表,在Schema Pattern里写上大写的用户名,来实现过滤。
关于Hibernate通过MyEclipse 建立oracle数据库连接时,报出下面的错误.
java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-12705: invalid or unknown NLS parameter value specified
是驱动问题。
hibernate.hbm2ddl.auto
validate 加载hibernate时,验证创建数据库表结构
create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
create-drop 加载hibernate时创建,退出是删除表结构
update 加载hibernate自动更新数据库结构
Hibernate 的saveOrUpdate方法
hibernate提供了saveOrUpdate的方法来进行数据库的操作。hibernate会根据对象的状态决定是insert还是update,其根本是通过xml文件中unsaved-value来确定的(默认为null)。如果设置null,系统会根据传入的对象的id的值判断,如果是null,则表示对象不存在,那么insert;如果不是Null,则表示已经存在,那么update.如果设置为none,那么表示对象不存在,会始终调用insert;如果设置为any,那么表示对象始终存在,会始终调用update。
说明:默认unsaved-value="null" ,这时有所不同,hibernate会根据主键产生一个select,来判断此对象是否已被持久化,已被持久化则update,未被持久化则save。当主键生成策略为assigned时,如果ID重复了,不会报错,会将已有数据更新。
数据库表主键
Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用“native”。class 表示采用由生成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括:
- “assigned” 主键由外部程序负责生成,在 save() 之前指定一个。
- “hilo” 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
- “seqhilo”与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence, 适用于支持 Sequence 的数据库,如Oracle。
- “increment”主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值, 之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
- “identity”采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
- “sequence”采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
- “native”由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
- “uuid.hex”由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
- “uuid.string”与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。
- “foreign”使用另外一个相关联的对象的标识符作为主键。
Hibernate统计函数
从Hibernate 3.0.x/3.1.x升级到最新的3.2版之后,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。
这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。如:
count = ((Integer)iter.next()).intValue(); 这样会报ClassCastException。改为这样就可以了,count = ((Number)iter.next()).intValue()。
public int getTotalCount(String hql) { int count=0; String countStr = "select count(*) "+ hql; List list = findHelper(countStr); Iterator iter = list.iterator(); if(iter.hasNext()){ count = ((Number)iter.next()).intValue(); } return count; }
附:在org.hibernate包中有下面三个对很有用的接口:
1、Interface ScrollableResults
这个接口类似JDBC中的ResultSet一样,提供了对返回结果集合的遍历和字段访问方法,如:
public boolean next() 游标后移
public boolean previous() 游标前移
public boolean scroll(int i) 游标移动到指定未知
public void beforeFirst() 游标在首记录前
public void afterLast() 游标在末记录后
public Object[] get() 将当前记录的字段值以Object对象数组形式返回
public Object get(int i) 将当前记录的特定字段值以Object对象形式返回
public Integer getInteger(int col) 将当前记录的特定字段值以Integer对象返回
public Long getLong(int col) 将当前记录的特定字段值以Long对象返回
public String getText(int col) 将当前记录的特定字段值以Text对象返回
public String getString(int col) 将当前记录的特定字段值以String对象返回
...
2、Interface Query
Query接口封装了对数据库的查询等操作,在这里,我们使用到它的原因是在于它的scroll()方法可以返回一个ScrollableResults实例:
public ScrollableResults scroll() 将查询结果以ScrollableResults实例返回,但需要注意的是查询返回的结果其实只是一些id,当需要的时候(比如我们使用ScrollableResults.next()方法后移游标时)这条需要用到的记录才会被真正初始化。
3、Interface Session
Session是Hibernate的核心中的核心,通过Session的createQuery()方法,我们能生成一个Query实例:
public
Query createQuery(String queryString) 用给出的HQL查询串创建一个Query实例。
例子:
public List statTotalCharge(Date statTimeBegin, Date statTimeEnd) throws DaoException{ List res = new Vector();//将用于存放保存的结果集合 Session session = null; ScrollableResults srs = null; try{ session = HibernateSessionFactory.openSession();//得到一个Hibernate Session //下面创建一个匿名Query实例并调用他的scroll()方法返回以ScrollableResults形式组织的查询结果 srs = session.createQuery(“select b.name, count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from charge a, customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >= ? and a.chargeEndTime < ? gourp by a.idCustomer“).setDate(0, statTimeBegin).setDate(1, statTimeEnd).scroll(); //将查询结果放入List保存 while(srs.next()){ res.add(new TotalCharge(srs.getString(0), srs,getDouble(1), srs.getDate(2), srs.getDate(3))); } }catch(HibernateException he){ if(srs!=null){ try{ srs.close(); }catch(Exception e){ ; } } }finally{ try{ session.close(); }catch(Exception e){ ; } } return res; }
- ojdbc5.jar (1.8 MB)
- 下载次数: 38
发表评论
-
SpringBoot开发WebService之Axis
2019-07-14 23:56 4893一、服务器端发布WebService服务 1、POM.xml文 ... -
SpringBoot开发WebService之CXF
2019-07-14 23:56 1353一、在服务器端的WebSerivce服务发布 1、POM.xm ... -
SpringBoot项目非web方式启动
2019-07-03 17:02 48171、springboot 1.x中以非web方式启动 @S ... -
SpringBoot使用Druid数据库密码加密
2019-03-06 23:28 15281、生成公钥、私钥和密码加密串 java -cp drui ... -
Spring Annotation
2010-12-02 17:14 0Spring2.x引入了组件自动扫描机制,可以在类路径底 ... -
Spring分布式事务实现
2010-11-10 14:28 83207分布式事务是指操作多个数据库之间的事务,spring的 ... -
Spring3 Annotation + Hibernate3-jpa2.0 + CGLIB + 多数据源
2010-08-19 09:30 10527一、定义一个测试用Entity。 @Entity pub ... -
使用iBatis2.0
2010-05-26 10:20 0一、NULL问题 ibatis操作oracle数据库时, ... -
使用AspectJ LTW(Load Time Weaving)
2010-01-04 14:25 10792在Java 语言中,从 ... -
Spring2.0 AOP AspectJ 注释实现
2010-01-04 14:24 5595一、AOP基本概念 切面(Aspect): 一个关注点的模块 ... -
Spring + JPA + Hibernate配置
2010-01-04 14:24 34747<1>persistence.xml放到类路径下的 ... -
配置spring数据源
2009-11-06 16:47 1249配置一个数据源 Spring在第三方依赖包中包含了两 ... -
hibernate的dialect
2009-07-23 10:04 5462一、hibernate的dialect RDBM ... -
spring ibatis入门
2009-04-20 14:16 3895一、applicationContext.xml <?x ... -
Hibernate缓存配置/批量处理
2009-03-25 21:50 10974Hibernate除了自动对Se ... -
Hibernate的一级与二级缓存
2009-03-25 21:24 1717缓存是介于应用程序和物理数据源之间,其作用是为了降低应用 ... -
spring jdbcTemplate使用
2008-07-15 17:17 78226一、使用示例 (1)springJdbcContext.xml ... -
Spring2.X以AspectJ 式AOP 配置事务
2008-07-10 13:23 2101(1)配置: Spring的事务管理是通过AOP代理实 ... -
spring 事务管理
2008-07-08 16:35 12015声明式的事务管理(Declarative transactio ... -
Hibernate中one-to-many/many-to-one和many-to-many
2008-06-28 17:03 3979<1>one-to-many/many-to-on ...
相关推荐
### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...
`saveOrUpdate`是Hibernate提供的一种便捷方法,用于处理对象的保存或更新操作。在深入讲解`saveOrUpdate`之前,我们先理解一下Hibernate的基本概念。 在Hibernate中,实体类(Entity Class)代表数据库中的表,...
例如,使用 `save()` 或 `saveOrUpdate()` 方法保存对象,`get()` 或 `load()` 方法获取对象,`update()` 更新对象,以及 `delete()` 删除对象。同时,Session 提供了事务管理能力,可以确保数据操作的原子性和一致...
例如,`Session`接口是主要的持久化工作接口,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法加载实体,`update()`更新实体,`delete()`删除实体。 5. **查询语言HQL**:Hibernate Query ...
Hibernate 难点解析: hibernate中uuid和...Hibernate get与load的区别 hibernate二级缓存中list和iterator的用法 Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别
- 读取(Read):使用`Session.get()`或`Session.load()`根据ID获取对象,`Query`接口则提供了更灵活的查询方式。 - 更新(Update):调用`Session.update()`或`Session.saveOrUpdate()`更新对象。 - 删除...
### Hibernate中的`save()`与`saveOrUpdate()`方法详解 #### 一、概述 在Java持久化框架Hibernate中,`save()`与`saveOrUpdate()`是非常重要的两个方法,它们用于处理对象的持久化操作。理解这两个方法的工作原理...
4. Session API:学习如何创建和关闭Session,以及如何进行持久化操作,如保存(Save/SaveOrUpdate)、更新(Update)、删除(Delete)和加载(Get/Load)对象。 5. 查询:掌握HQL(Hibernate Query Language)和...
通过`get()`或`load()`方法获取数据库中的记录: ```java session = sessionFactory.openSession(); user = session.get(User.class, 1L); System.out.println(user.getName()); session.close(); ``` #### 更新...
5. **查询操作**:可以使用Session的`get()`、`load()`或HQL/Criteria API进行查询。 **五、运行示例** 在主函数中,按照上述步骤进行操作,例如: ```java public static void main(String[] args) { ...
- **读取(Read)**:通过Session的`get()`或`load()`方法获取特定ID的对象。 ```java User user = (User) session.get(User.class, 1L); ``` - **更新(Update)**:修改对象属性后,调用`update()`方法更新...
4. Hibernate的持久化操作:包括保存(Save/SaveOrUpdate)、更新(Update)、删除(Delete)和加载(Get/Load)对象。 5. 查询语言HQL:学习编写HQL查询语句,以面向对象的方式查询数据库。 6. Criteria API:了解...
在Java的持久化框架Hibernate中,实体对象的状态管理和`saveOrUpdate`方法是核心概念,对于理解和有效使用Hibernate至关重要。在本教程中,我们将深入探讨实体对象的三种状态以及`saveOrUpdate`方法的工作原理。 ...
这涉及到使用Session的save()、saveOrUpdate()、load()、get()、update()、merge()和delete()方法。同时,还会讨论事务管理和并发控制,确保数据的一致性和完整性。 查询语言在Hibernate中主要有两种:HQL...
(5).get(Class classes,Serializable pk); //该方法会立即加载/获取数据(只要调用该方法就会立即向数据库发出查询语句),该方法只在内部缓存查找数据,如果内部缓存中没有数据就直接去数据库查询,当数据库中没有要...
4. 加载(Get/Load):根据ID获取数据库中的对象。 5. 查询(Query/Criteria):使用HQL或Criteria API执行复杂的数据查询。 六、缓存机制 Hibernate提供了二级缓存机制,包括Session级别的第一级缓存和...
- 读取(Read):`Session.get()`或`Session.load()`用于根据主键获取对象,而`Query`或`Criteria`接口则支持更复杂的查询。 - 更新(Update):通过`Session.update()`或`Session.saveOrUpdate()`更新已存在的...