默认情况下,在hibernate启动的时候,会为每个实体类生成简单的读取,删除,更新,创建语句,它是怎么生成更新的呢,它怎么知道更新的列,生成更新所有列的sql语句,如果值没有修改,则被设置为它的旧值,如果表的列比较多,即使只更新了一个列,也会生成很长的sql语句,必须关闭启动时生成sql语句,hibernate提供了dynamic-insert和dynamic-update属性,用来关闭生成sql语句,看下面例子。
持久化类
package com.own.model;
import java.io.Serializable;
public class Goods implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String goodsName;
private Double price;
private String goodsDescription;
public Goods(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getGoodsDescription() {
return goodsDescription;
}
public void setGoodsDescription(String goodsDescription) {
this.goodsDescription = goodsDescription;
}
@Override
public boolean equals(Object o) {
if(o == null || o.getClass() != this.getClass()){
return false;
}
if(o == this){
return true;
}
Goods goods = (Goods) o;
if(id == null ? goods.id == null : this.id.equals(goods.id)){
return true;
}
return false;
}
@Override
public int hashCode() {
return this.id.hashCode() ;
}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="com.own.model.Goods" table="goods" dynamic-insert="false" dynamic-update="false" >
<id name="id" column="goods_id" >
<generator class="native"></generator>
</id>
<property name="price" column="goods_price" type="double" ></property>
<property name="goodsName" column="goods_name" type="string" ></property>
<property name="goodsDescription" column="goods_description" type="string" ></property>
</class>
</hibernate-mapping>
调用hibernate的保存和更新方法,会生成如下的sql语句,
insert
into
goods
(goods_price, goods_name, goods_description)
values
(?, ?, ?)
update
goods
set
goods_price=?,
goods_name=?,
goods_description=?
where
goods_id=?
如果把属性修改为true,则hibernat在生成insert语句时,会根据持久化类的属性,如果属性的值为null,则生成不插入该字段的sql语句,在更新的时候,如果该实体在session管理中,修改某个属性,则只生成修改该字段的更新语句,而不是把所有的属性都更新。
insert
into
goods
(goods_name)
values
(?)
update
goods
set
goods_name=?
where
goods_id=?
如果使用jpa,使用注解元数据的话,则要使用hibernate提供的注解,实体代码如下
package com.own.model;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@org.hibernate.annotations.Entity(dynamicInsert=true,dynamicUpdate=true)
@Table(name="goods")
public class Goods implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String goodsName;
private Double price;
private String goodsDescription;
public Goods(){}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="goods_id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="goods_name",length=40,nullable=false)
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
@Column(name="goods_price")
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Column(name="goods_description")
public String getGoodsDescription() {
return goodsDescription;
}
public void setGoodsDescription(String goodsDescription) {
this.goodsDescription = goodsDescription;
}
@Override
public boolean equals(Object o) {
if(o == null || o.getClass() != this.getClass()){
return false;
}
if(o == this){
return true;
}
Goods goods = (Goods) o;
if(id == null ? goods.id == null : this.id.equals(goods.id)){
return true;
}
return false;
}
@Override
public int hashCode() {
return this.id.hashCode() ;
}
}
加上这两个属性,就避免了当数据表中字段很多的情况下,更新没有修改的字段,插入的时候,就不生成插入属性为null的字段。
分享到:
相关推荐
在Java的Hibernate ORM框架中,`dynamic-insert`和`dynamic-update`是两个非常重要的属性,它们主要用于优化数据库的插入和更新操作。这两个属性主要应用于实体类的映射文件(.hbm.xml)中,用于控制Hibernate如何...
- **dynamic-insert**: 是否动态插入 SQL 语句,仅插入非空字段。 - **select-before-update**: 更新前是否先查询实体。 - **polymorphism**: 多态映射类型。 - **where**: 在查询时添加额外的 WHERE 子句。 - **...
- **动态插入和更新**:`dynamic-insert`和`dynamic-update`属性允许Hibernate只插入或更新那些确实发生更改的字段。这对于避免不必要的数据库操作非常有用。 - **默认值类型**:默认值表达式的类型应与列的数据类型...
在《精通Hibernate:Java对象持久化技术详解》的第4章以及后续章节中,主要探讨了如何通过映射配置来控制对象的插入(insert)和更新(update)行为,以及一对多关联关系的管理。 映射属性是Hibernate配置文件中的...
为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解其常用的属性及其作用。 ##### 1. `<class>`元素 - **`name`**:指定类的完整包名,如`com.example.Person`。 - **`table`**:对应数据库中的...
: "field-description">指定描述类的属性javaDoc <!-- 更多的元数据属性配置 --> ### Hibernate配置详解 ...通过理解这些配置元素和属性,开发者可以更有效地使用Hibernate进行数据库操作,实现高效的数据持久化。
<class name="com.isoftstone.javasource.course" table="courses" dynamic-insert="true" dynamic-update="true"> </hibernate-mapping> ``` 上述示例展示了如何使用XML映射文件定义一个课程实体,指定其...
- **dynamic-update**和**dynamic-insert**: 控制是否动态生成SQL更新和插入语句,基于只有修改过的字段。 - **select-before-update**: 在更新前是否先执行SELECT语句,确保并发安全。 - **polymorphism**: 控制...
- **动态类型**:使用 `<dynamic-insert>` 和 `<dynamic-update>` 实现动态 SQL。 - **延迟加载**:通过 `<lazy>` 属性控制关联对象的加载时机。 ##### 4.5 Tuplizer - **目的**:解释 Tuplizer 的作用及其配置...
若要更新部分字段,可以使用`dynamic-insert`和`dynamic-update`属性,使Hibernate仅包含实际变化的字段生成SQL语句,提高效率。 处理SQL引用标识符是另一个重要的话题。在SQL中,特殊字符或包含空格的字段名需要...
- **`dynamic-insert`** 和 **`dynamic-update`**: 这两个属性用于控制Hibernate是否动态地创建SQL插入和更新语句。默认情况下,这两个属性都是`false`。 - **`dynamic-update`**: 如果设置为`true`,则只更新那些...
dynamic-update="true" dynamic-insert="true" batch-size="3"> column="id" type="java.lang.Integer"> </hibernate-mapping> ``` #### 七、Hibernate配置文件(hibernate.cfg.xml)设置 `...
- `dynamic-insert`:如果设为`true`,Hibernate仅在字段不为null时插入。 - `dynamic-update`:如果设为`true`,Hibernate仅在字段不为null时更新。 - `<id>`:定义主键映射。 - `name`:指定主键字段名称。 -...
### CVS适用及其在MyEclipse中的发布 ...根据描述中的部分代码片段,可以看出这里涉及到的配置主要是指`dynamic-insert`和`dynamic-update`属性,它们用于控制Hibernate是否动态地插入或更新记录。例如: ```xml ...
通过使用Hibernate,开发人员可以将Java对象映射到数据库表中,并在不编写SQL的情况下执行CRUD操作。 #### 二、如何进行Hibernate编程? 进行Hibernate编程主要包括以下几个步骤: 1. **环境搭建**:下载并安装...
说明了Hibernate查询语言(HQL)和Java持久化查询语言(JPQL)的使用,包括大小写敏感性,语句类型(Select,Update,Delete,Insert),FROM子句的使用,以及如何在查询中使用表达式。 以上内容是Hibernate5用户...
- **Hibernate逆向工程**:解决`ids for this class must be manually assigned`错误,修改了自动生成的ID配置,添加了`dynamic-update`和`dynamic-insert`属性以优化数据库操作。 - **Spring与Hibernate集成**:...
### hbm.xml说明详解 ...综上所述,`hbm.xml`文件在Hibernate框架中扮演着至关重要的角色,通过对`class`、`id`和`property`等元素的精细控制,可以实现复杂的数据持久化逻辑,满足各种业务需求。