Hibernate 中如果直接使用
Session.update(Object o);
会把这个表中的所有字段更新一遍。
比如:
view plaincopy to clipboardprint?
public class TeacherTest {
@Test
public void update(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher) session.get(Teacher.class, 3);
t.setName(“yangtb2″);
session.update(t);
session.getTransaction().commit();
}
}
public class TeacherTest {
@Test
public void update(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher) session.get(Teacher.class, 3);
t.setName(“yangtb2″);
session.update(t);
session.getTransaction().commit();
}
}
Hibernate 执行的SQL语句:
view plaincopy to clipboardprint?
Hibernate:
update
Teacher
set
age=?,
birthday=?,
name=?,
title=?
where
id=?
Hibernate:
update
Teacher
set
age=?,
birthday=?,
name=?,
title=?
where
id=?
我们只更改了Name属性,而Hibernate 的sql语句 把所有字段都更改了一次。
这样要是我们有字段是文本类型,这个类型存储的内容是几千,几万字,这样效率会很低。
那么怎么只更改我们更新的字段呢?
有三中方法:
1.XML中设置property 标签 update = “false” ,如下:我们设置 age 这个属性在更改中不做更改
view plaincopy to clipboardprint?
<property name=”age” update=”false”></property>
<property name=”age” update=”false”></property>
在Annotation中 在属性GET方法上加上@Column(updatable=false)
view plaincopy to clipboardprint?
@Column(updatable=false)
public int getAge() {
return age;
}
@Column(updatable=false)
public int getAge() {
return age;
}
我们在执行 Update方法会发现,age 属性 不会被更改
view plaincopy to clipboardprint?
Hibernate:
update
Teacher
set
birthday=?,
name=?,
title=?
where
id=?
Hibernate:
update
Teacher
set
birthday=?,
name=?,
title=?
where
id=?
缺点:不灵活····
2.第2种方法··使用XML中的 dynamic-update=”true”
view plaincopy to clipboardprint?
<class name=”com.sccin.entity.Student” table=”student” dynamic-update=”true”>
<class name=”com.sccin.entity.Student” table=”student” dynamic-update=”true”>
OK,这样就不需要在字段上设置了。
但这样的方法在Annotation中没有
3.第三种方式:使用HQL语句(灵活,方便)
使用HQL语句修改数据
view plaincopy to clipboardprint?
public void update(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery(“update Teacher t set t.name = ‘yangtianb’ where id = 3″);
query.executeUpdate();
session.getTransaction().commit();
}
public void update(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Query query = session.createQuery(“update Teacher t set t.name = ‘yangtianb’ where id = 3″);
query.executeUpdate();
session.getTransaction().commit();
}
Hibernate 执行的SQL语句:
view plaincopy to clipboardprint?
Hibernate:
update
Teacher
set
name=’yangtianb’
where
id=3
Hibernate:
update
Teacher
set
name=’yangtianb’
where
id=3
这样就只更新了我们更新的字段·····
分享到:
相关推荐
在使用Hibernate时,处理BLOB字段的过程会有所不同,因为Hibernate提供了一种更面向对象的方式来操作数据库。你可能需要定义一个实体类,包含BLOB类型的属性,并使用Hibernate的Session接口来保存或更新对象。例如:...
如果在`<class>`映射中设置了`dynamic-update="true"`,Hibernate会在生成的SQL更新语句中只包含实际被修改的字段,而不是所有字段。这可以显著减少不必要的数据传输和数据库操作,从而提升性能。然而,`dynamic-...
- **更新(Update)**:调用Session的update()方法,将已存在的对象状态同步到数据库。 - **删除(Delete)**:使用Session的delete()方法,根据传入的对象或ID删除对应的数据库记录。 - **加载(Load)**:通过...
要取消或控制Hibernate的自动更新,我们可以采取以下几种策略: 1. **设置属性为只读**:如果某个属性不需要被更新,可以使用`@Column(readOnly = true)`注解,这将告诉Hibernate不要将该字段的值写回数据库。 2. ...
主要有以下几种级联类型: 1. `save-update`:当保存或更新父实体时,会自动保存或更新所有关联的子实体。 2. `merge`:在调用`session.merge()`时,不仅合并父实体的状态,也会处理所有关联的子实体。 3. `delete`...
接下来将详细介绍其中的几种核心方法: 1. **删除操作** - `void delete(Object entity)`:此方法用于删除指定的持久化实例。 - `void deleteAll(Collection entities)`:批量删除集合中的所有持久化实例。 2. ...
在Hibernate中,悲观锁主要通过以下几种方式实现: 1. **For Update**:在SQL查询语句中添加`FOR UPDATE`子句,如`SELECT * FROM table WHERE id = ? FOR UPDATE`,这样在查询时就会锁定相关行,直到当前事务结束。...
- **Update**:调用对象的 `Session` 方法 `update()` 更新对象。 - **Delete**:使用 `Session` 的 `delete()` 方法删除对象。 5. **提交事务**:所有操作完成后,提交事务以确保更改持久化到数据库。 6. **...
7. **操作数据库**:生成的实体类可以配合Hibernate Session接口进行CRUD(创建、读取、更新、删除)操作,例如,使用Session的save()、get()、update()、delete()方法,以及Query和Criteria API进行更复杂的查询。...
`save()`, `saveOrUpdate()`, `update()`, `delete()` 是Session的基本操作方法。 3. **查询语言**:Hibernate提供了一种称为HQL(Hibernate Query Language)的面向对象的查询语言,类似于SQL,但操作的是对象而非...
8. **CRUD操作**:创建(Create)、读取(Read)、更新(Update)和删除(Delete)是Hibernate的主要功能。使用`save()`, `load()`, `update()`, `delete()`方法即可完成对数据的操作。 9. **查询语言(HQL)**:...
Hibernate 提供了回调机制,如预加载(pre-load)、加载后(post-load)、预更新(pre-update)、预删除(pre-delete)等,允许开发者在特定操作前后执行自定义逻辑。 十一、性能优化 为了提升性能,开发者应关注...
4. **持久化(Persistence)**: 使用Session对象进行持久化操作,如save()、update()、delete()和load()方法,以及Query和Criteria API来进行查询。 5. **事务管理(Transaction)**: Hibernate支持JTA和JDBC两种...
以下是几种常见的 KeyGenerator 类型: - **Assigned**: 由开发人员手动指定主键值。 - **hilo**: 使用 hi-lo 算法生成主键值,适用于大部分数据库。 - **seqhilo**: 类似于 hilo,但仅适用于支持序列的数据库,如 ...
例如,使用`Session`对象的`save()`或`saveOrUpdate()`方法保存实体,`get()`或`load()`方法获取实体,`update()`或`merge()`方法更新实体,以及`delete()`方法删除实体。 6. **HQL与Criteria查询**:Hibernate支持...
- **Update(更新)**:调用`update()`方法更新对象的属性,然后`flush()`提交到数据库。 - **Delete(删除)**:`delete()`方法用于根据主键删除对象,或通过查询结果删除多条记录。 **5. Hibernate 的缓存机制** ...
级联操作是Hibernate提供的一种便捷特性,它使得在一个实体对象发生变化时,可以自动影响与其关联的其他对象的状态,无需显式调用每个相关对象的保存或更新方法。 在这个项目中,级联保存的实现主要涉及到以下几个...
下面,我们将详细讨论Hibernate的几个关键概念和常用方法。 1. **配置Hibernate** 在使用Hibernate之前,我们需要配置一个`hibernate.cfg.xml`文件,其中包含数据库连接信息,如URL、用户名、密码、驱动类等。此外...
Hibernate是一种强大的工具,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层的数据访问细节。 首先,让我们深入了解Hibernate。Hibernate是一个开源的ORM框架,它的主要功能是为Java应用程序提供...
例如,`save()`用于插入新记录,`update()`用于更新现有记录,`delete()`用于删除记录,`load()`和`get()`用于根据主键获取对象。 4. **Criteria查询**:这是Hibernate提供的API,可以动态构造查询条件。通过`...