Hibernate的性能优化之 dynamic-update dynamic-insert
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也会给我们添加记录的