`
yun342173024
  • 浏览: 73807 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate dynamic-insert 和 dynamic-update使用

 
阅读更多
默认情况下,在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的字段。
分享到:
评论

相关推荐

    dynamic-insert,dynamic-update 我有话要说

    在Java的Hibernate ORM框架中,`dynamic-insert`和`dynamic-update`是两个非常重要的属性,它们主要用于优化数据库的插入和更新操作。这两个属性主要应用于实体类的映射文件(.hbm.xml)中,用于控制Hibernate如何...

    hibernate-mapping参数详解

    - **dynamic-insert**: 是否动态插入 SQL 语句,仅插入非空字段。 - **select-before-update**: 更新前是否先查询实体。 - **polymorphism**: 多态映射类型。 - **where**: 在查询时添加额外的 WHERE 子句。 - **...

    hibernate实体映射文件字段设置默认值

    - **动态插入和更新**:`dynamic-insert`和`dynamic-update`属性允许Hibernate只插入或更新那些确实发生更改的字段。这对于避免不必要的数据库操作非常有用。 - **默认值类型**:默认值表达式的类型应与列的数据类型...

    Hibernate笔记.doc

    在《精通Hibernate:Java对象持久化技术详解》的第4章以及后续章节中,主要探讨了如何通过映射配置来控制对象的插入(insert)和更新(update)行为,以及一对多关联关系的管理。 映射属性是Hibernate配置文件中的...

    hibernate关联映射的作用和常用属性解释

    为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解其常用的属性及其作用。 ##### 1. `&lt;class&gt;`元素 - **`name`**:指定类的完整包名,如`com.example.Person`。 - **`table`**:对应数据库中的...

    hibernate说明文档

    : "field-description"&gt;指定描述类的属性javaDoc &lt;!-- 更多的元数据属性配置 --&gt; ### Hibernate配置详解 ...通过理解这些配置元素和属性,开发者可以更有效地使用Hibernate进行数据库操作,实现高效的数据持久化。

    Hibernate 文档.doc

    &lt;class name="com.isoftstone.javasource.course" table="courses" dynamic-insert="true" dynamic-update="true"&gt; &lt;/hibernate-mapping&gt; ``` 上述示例展示了如何使用XML映射文件定义一个课程实体,指定其...

    常用 Hibernate 映射配置说明.doc

    - **dynamic-update**和**dynamic-insert**: 控制是否动态生成SQL更新和插入语句,基于只有修改过的字段。 - **select-before-update**: 在更新前是否先执行SELECT语句,确保并发安全。 - **polymorphism**: 控制...

    hibernate文档

    - **动态类型**:使用 `&lt;dynamic-insert&gt;` 和 `&lt;dynamic-update&gt;` 实现动态 SQL。 - **延迟加载**:通过 `&lt;lazy&gt;` 属性控制关联对象的加载时机。 ##### 4.5 Tuplizer - **目的**:解释 Tuplizer 的作用及其配置...

    精通Hibernate第四章

    若要更新部分字段,可以使用`dynamic-insert`和`dynamic-update`属性,使Hibernate仅包含实际变化的字段生成SQL语句,提高效率。 处理SQL引用标识符是另一个重要的话题。在SQL中,特殊字符或包含空格的字段名需要...

    hibernate配置详细

    - **`dynamic-insert`** 和 **`dynamic-update`**: 这两个属性用于控制Hibernate是否动态地创建SQL插入和更新语句。默认情况下,这两个属性都是`false`。 - **`dynamic-update`**: 如果设置为`true`,则只更新那些...

    hibernate保存图片

    dynamic-update="true" dynamic-insert="true" batch-size="3"&gt; column="id" type="java.lang.Integer"&gt; &lt;/hibernate-mapping&gt; ``` #### 七、Hibernate配置文件(hibernate.cfg.xml)设置 `...

    hibernate配置详解

    - `dynamic-insert`:如果设为`true`,Hibernate仅在字段不为null时插入。 - `dynamic-update`:如果设为`true`,Hibernate仅在字段不为null时更新。 - `&lt;id&gt;`:定义主键映射。 - `name`:指定主键字段名称。 -...

    CVS适用,及在MYECLISPE中发布

    ### CVS适用及其在MyEclipse中的发布 ...根据描述中的部分代码片段,可以看出这里涉及到的配置主要是指`dynamic-insert`和`dynamic-update`属性,它们用于控制Hibernate是否动态地插入或更新记录。例如: ```xml ...

    持久层hibernate详解

    通过使用Hibernate,开发人员可以将Java对象映射到数据库表中,并在不编写SQL的情况下执行CRUD操作。 #### 二、如何进行Hibernate编程? 进行Hibernate编程主要包括以下几个步骤: 1. **环境搭建**:下载并安装...

    Hibernate5 的用户手册中文版

    说明了Hibernate查询语言(HQL)和Java持久化查询语言(JPQL)的使用,包括大小写敏感性,语句类型(Select,Update,Delete,Insert),FROM子句的使用,以及如何在查询中使用表达式。 以上内容是Hibernate5用户...

    工作周报10221

    - **Hibernate逆向工程**:解决`ids for this class must be manually assigned`错误,修改了自动生成的ID配置,添加了`dynamic-update`和`dynamic-insert`属性以优化数据库操作。 - **Spring与Hibernate集成**:...

    hbm.xml说明

    ### hbm.xml说明详解 ...综上所述,`hbm.xml`文件在Hibernate框架中扮演着至关重要的角色,通过对`class`、`id`和`property`等元素的精细控制,可以实现复杂的数据持久化逻辑,满足各种业务需求。

Global site tag (gtag.js) - Google Analytics