前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate的性能优化之 dynamic-update dynamic-insert

Hibernate的性能优化之 dynamic-update dynamic-insert

作者头像
Hongten
发布2018-09-18 09:47:33
6280
发布2018-09-18 09:47:33
举报
文章被收录于专栏:HongtenHongten

Guestbook.java

代码:

package com.b510.examples;

import java.util.Date;

public class Guestbook implements java.io.Serializable {

 private static final long serialVersionUID = -7004492417383895995L;  private Integer id;  private String name;  private String email;  private String phone;  private String title;  private String content;  private Date createdTime;  private Integer version;

 // Constructors

 /**   * @return the version   */  public Integer getVersion() {   return version;  }

 /**   * @param version   *            the version to set   */  public void setVersion(Integer version) {   this.version = version;  }

 /**   * @return the name   */  public String getName() {   return name;  }

 public Integer getId() {   return this.id;  }

 public void setId(Integer id) {   this.id = id;  }

 /**   * @param name   *            the name to set   */  public void setName(String name) {   this.name = name;  }

 /**   * @return the email   */  public String getEmail() {   return email;  }

 /**   * @param email   *            the email to set   */  public void setEmail(String email) {   this.email = email;  }

 /**   * @return the phone   */  public String getPhone() {   return phone;  }

 /**   * @param phone   *            the phone to set   */  public void setPhone(String phone) {   this.phone = phone;  }

 /**   * @return the title   */  public String getTitle() {   return title;  }

 /**   * @param title   *            the title to set   */  public void setTitle(String title) {   this.title = title;  }

 /**   * @return the content   */  public String getContent() {   return content;  }

 /**   * @param content   *            the content to set   */  public void setContent(String content) {   this.content = content;  }

 /**   * @return the createdTime   */  public Date getCreatedTime() {   return createdTime;  }

 /**   * @param createdTime   *            the createdTime to set   */  public void setCreatedTime(Date createdTime) {   this.createdTime = createdTime;  }

 /** default constructor */  public Guestbook() {  } }

Guestbook.hbm.xml

代码:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>  <class name="com.b510.examples.Guestbook" table="guestbook"   catalog="users" optimistic-lock="version">   <id name="id" type="java.lang.Integer">    <column name="id" />    <generator class="increment" />   </id>   <version name="version" column="version" access="field"></version>   <property name="name" type="java.lang.String">    <column name="name" length="200" />   </property>   <property name="email" type="java.lang.String">    <column name="email" length="50" />   </property>   <property name="phone" type="java.lang.String">    <column name="phone" length="20" />   </property>   <property name="title" type="java.lang.String">    <column name="title" length="200" />   </property>   <property name="content" type="java.lang.String">    <column name="content" length="1000" />   </property>   <property name="createdTime" type="java.util.Date">    <column name="created_time" length="10" />   </property>  </class> </hibernate-mapping>

测试代码:

HibernateTest.java

代码:

/**  *  */ package com.b510.examples;

import org.hibernate.Session;

/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }  public void update(){   Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.beginTransaction();   Guestbook gb=(Guestbook)session.get(Guestbook.class, 2);   System.out.println(gb.getName());   gb.setName("北京");   System.out.println("----------------------------");   gb=(Guestbook)session.get(Guestbook.class, 2);   System.out.println(gb.getName());   session.getTransaction().commit();    } }

运行效果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         guestbook0_.id as id0_0_,         guestbook0_.version as version0_0_,         guestbook0_.name as name0_0_,         guestbook0_.email as email0_0_,         guestbook0_.phone as phone0_0_,         guestbook0_.title as title0_0_,         guestbook0_.content as content0_0_,         guestbook0_.created_time as created8_0_0_     from         users.guestbook guestbook0_     where         guestbook0_.id=? 广州 ---------------------------- 北京 Hibernate:     update         users.guestbook     set version=?,         name=?,         email=?,         phone=?,         title=?,         content=?,         created_time=?     where         id=?         and version=? 我们看到的是我们只是跟新的是Guestbook对象的name属性值,但是呢,一个update语句却是

把所有的属性都给跟新了一遍,这样不就是很浪费时间吗?

怎样做才可以让Hibernate只是跟新我们所关注的东西,而不是我们所关注的东西,就不要去跟新他?

有一个办法可行滴!

Guestbook.hbm.xml

代码:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>  <class name="com.b510.examples.Guestbook" table="guestbook"   catalog="users" optimistic-lock="version" dynamic-update="true">                  <!--          在这里加入动态跟新-->   <id name="id" type="java.lang.Integer">    <column name="id" />    <generator class="increment" />   </id>   <version name="version" column="version" access="field"></version>   <property name="name" type="java.lang.String">    <column name="name" length="200" />   </property>   <property name="email" type="java.lang.String">    <column name="email" length="50" />   </property>   <property name="phone" type="java.lang.String">    <column name="phone" length="20" />   </property>   <property name="title" type="java.lang.String">    <column name="title" length="200" />   </property>   <property name="content" type="java.lang.String">    <column name="content" length="1000" />   </property>   <property name="createdTime" type="java.util.Date">    <column name="created_time" length="10" />   </property>  </class> </hibernate-mapping>

同样的测试代码:

运行效果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         guestbook0_.id as id0_0_,         guestbook0_.version as version0_0_,         guestbook0_.name as name0_0_,         guestbook0_.email as email0_0_,         guestbook0_.phone as phone0_0_,         guestbook0_.title as title0_0_,         guestbook0_.content as content0_0_,         guestbook0_.created_time as created8_0_0_     from         users.guestbook guestbook0_     where         guestbook0_.id=? 广州 ---------------------------- 北京 Hibernate:     update         users.guestbook     set   version=?,         name=?     where         id=?         and version=? 我们看到这里显示的是跟新name和version属性

测试二:

HibernateTest.java

代码:

/**  *  */ package com.b510.examples;

import org.hibernate.Session;

/**  *  * @author XHW  *  * @date 2011-7-18  *  */ public class HibernateTest {  public static void main(String[] args) {   new HibernateTest().update();  }  public void update(){   Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.beginTransaction();   Guestbook gb=new Guestbook();   gb.setName("南京");   gb.setPhone("119");   gb.setTitle("hello world!");   session.save(gb);   session.getTransaction().commit();    } }

运行代码:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         max(id)     from         guestbook Hibernate:     insert     into         users.guestbook         (version, name, email, phone, title, content, created_time, id)     values         (?, ?, ?, ?, ?, ?, ?, ?) 我们会发现一个问题,那就是,我们只是插入了name,phone,title属性值,但是,insert语句却同时把

其他的东西也给添加了进去,我们是不希望看到这样的结果的,要解决这样的问题,我们同样有办法滴!

Guestbook.hbm.xml

代码:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>  <class name="com.b510.examples.Guestbook" table="guestbook"   catalog="users" optimistic-lock="version" dynamic-update="true"  dynamic-insert="true">                       动态插入数据   <id name="id" type="java.lang.Integer">    <column name="id" />    <generator class="increment" />   </id>   <version name="version" column="version" access="field"></version>   <property name="name" type="java.lang.String">    <column name="name" length="200" />   </property>   <property name="email" type="java.lang.String">    <column name="email" length="50" />   </property>   <property name="phone" type="java.lang.String">    <column name="phone" length="20" />   </property>   <property name="title" type="java.lang.String">    <column name="title" length="200" />   </property>   <property name="content" type="java.lang.String">    <column name="content" length="1000" />   </property>   <property name="createdTime" type="java.util.Date">    <column name="created_time" length="10" />   </property>  </class> </hibernate-mapping>

运行效果:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Hibernate:     select         max(id)     from         guestbook Hibernate:     insert     into         users.guestbook         (version, name, phone, title, id)     values         (?, ?, ?, ?, ?) 这样就达到了我们的预期要求,要说明的是:version属性是不可为空的,所以我们没有设置值的时候,Hibernate也会给我们添加记录的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-07-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档