`

hibernate知识小结

阅读更多

1.hibernate中java对象的三种状态,三种状态都是对缓存而言的。
1)临时状态
  New,delete()
  不在session的缓存中,数据库中无对应的数据。
2)持久化状态
  Save() 临时->持久
  load(),get() 返回持久
  update(),saveOrUpdate(),lock() 游离->持久
  在session的缓存中,数据库中有对应的数据。
3)游离状态
  Clear(),Close() 全部 持久->游离
  Evict() 一个 持久->游离
  不在session的缓存中,数据库中可能存在对应的数据

2.Session清理缓存的时间点
1)程序中调用net.sf.hibernate.Transaction的commit()方法的
  时候
2)程序中调用session的find()或iterate()时,hibernate3里已经取消了find方法,如果任然需要使用则可以使用org.hibernate.classic.Session

Java代码 复制代码

 

org.hibernate.classic.Session session = factory.openSession();
session.find("from User");


3)程序中显示调用session的flush()方法时。session.close()不会清理

 

例子如下:
A:

Java代码 复制代码

 

public void testUpdate(){
		Session session = factory.openSession();
		User user = (User)session.get(User.class, new Long("11"));
		user.setAddr("dalian");
		user.setAddr("beijing");
		
//		session.update(user);该条语句不要
//		session.beginTransaction().commit();//会自动执行update语句,因为user此时是持久化状态
		session.flush();//会自动执行update语句,因为user此时是持久化状态
		session.close();
		
	}


session.beginTransaction().commit();和session.flush();只要其中任一条语句。结果都是一样的
B:

Java代码 复制代码
public void testDelete(){
		Session session = factory.openSession();
		User user = (User)session.get(User.class, new Long("11"));
		session.delete(user);//user对象变为了临时状态
//		session.beginTransaction().commit();//先提交,再清理缓存,即delete会在数据库里执行。
		session.flush();//因为user为临时状态,不是持久化状态,所以flush()的时候只是清理缓存(也就是只对持久化状态的做同步),不会对user做同步,即delete不会在数据库里执行。
		session.close();
		
	}


session.beginTransaction().commit();和session.flush();只要其中一条语句,结果是不一样的
session.beginTransaction().commit();//先提交,再清理缓存,即delete会在数据库里执行。
session.flush();//因为user为临时状态,不是持久化状态,所以flush()的时候只是清理缓存(也就是只对持久化状态的做同步),不会对user做同步,即delete不会在数据库里执行。

清理缓存时,和数据库同步,同步的也只是持久化状态的对象。


3.复合型主键两种实现方式

第一种,复合主键都做为属性

User.java

Java代码 复制代码

 

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
/**
该类必须是实现了Serializable接口,必须重写equals和hashCode方法
*/
public class User implements java.io.Serializable {
	private String name;

	private String addr;

	private String email;

	
	public User() {
	}

	
	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public boolean equals(Object other) {
		if ((this == other))
			return true;
		if ((other == null))
			return false;
		if (!(other instanceof UserId))
			return false;
		User castOther = (User) other;

		return new EqualsBuilder().append(this.getName(), castOther.getName())
				.append(this.getAddr(), castOther.getAddr()).append(
						this.getEmail(), castOther.getEmail()).isEquals();
	}

	public int hashCode() {
		return new HashCodeBuilder().append(this.getName()).append(
				this.getAddr()).append(this.getEmail()).toHashCode();
	}

}



User.hbm.xml

Java代码 复制代码
  1. <?xml version="1.0"?>   
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
  4.   
  5. <hibernate-mapping>   
  6.     <class name="User" table="user" catalog="tie">   
  7.         <composite-id>   
  8.             <key-property name="name" type="string">   
  9.                 <column name="name" />   
  10.             </key-property>   
  11.             <key-property name="addr" type="string">   
  12.                 <column name="addr" />   
  13.             </key-property>   
  14.         </composite-id>   
  15.         <property name="email" type="string">   
  16.             <column name="email" not-null="true" />   
  17.         </property>   
  18.     </class>   
  19. </hibernate-mapping>  

 

使用方法:

Java代码 复制代码
  1. public void testCreate(){   
  2.   
  3.     User user = new User();   
  4.     user.setName("test1");   
  5.     user.setAddr("beijing");   
  6.     user.setEmail("test1@xx.com");   
  7.        
  8.     Session session = factroy.openSession();   
  9.     Transaction tx = session.beginTransaction();   
  10.     session.save(user);   
  11.     tx.commit();   
  12.     session.close();   
  13. }   
  14.   
  15. public void testLoad(){   
  16.        
  17.     User user = new User();   
  18.     user.setName("test1");   
  19.     user.setAddr("beijing");   
  20.     Session session = factroy.openSession();   
  21.     user = (User)session.load(User.class, user);//这里是user对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1"));   
  22.     System.out.println(user.getEmail());   
  23.        
  24. }  

 

第二种方式:复合主键单独作为一个对象
UserId.java

Java代码 复制代码
  1. /**  
  2. 必须实现Serializable 接口,重写hashCode 方法和equals函数  
  3. */  
  4. public class UserId  implements java.io.Serializable {   
  5.   
  6.      private String name;   
  7.      private String addr;   
  8.   
  9.     public UserId() {   
  10.     }   
  11.   
  12.     public UserId(String name, String addr) {   
  13.         this.name = name;   
  14.         this.addr = addr;   
  15.     }   
  16.   
  17.   
  18.     public String getName() {   
  19.         return this.name;   
  20.     }   
  21.        
  22.     public void setName(String name) {   
  23.         this.name = name;   
  24.     }   
  25.   
  26.     public String getAddr() {   
  27.         return this.addr;   
  28.     }   
  29.        
  30.     public void setAddr(String addr) {   
  31.         this.addr = addr;   
  32.     }   
  33.       
  34.   
  35.   
  36.   
  37.    public boolean equals(Object other) {   
  38.          if ( (this == other ) ) return true;   
  39.          if ( (other == null ) ) return false;   
  40.          if ( !(other instanceof UserId) ) return false;   
  41.          UserId castOther = ( UserId ) other;    
  42.             
  43.         return new EqualsBuilder().append(this.getName(), castOther.getName())   
  44.                 .append(this.getAddr(), castOther.getAddr()).isEquals();   
  45.    }   
  46.       
  47.    public int hashCode() {   
  48.          return new HashCodeBuilder().append(this.getName()).append(   
  49.                 this.getAddr()).toHashCode();   
  50.    }      
  51.   
  52. }  

 

User.java:

Java代码 复制代码
  1. /**  
  2. 该类不需要实现Serializable接口,也不需要重写equals和hashCode方法  
  3. */  
  4. public class User{   
  5.     private UserId id;   
  6.   
  7.     private String email;   
  8.   
  9.        
  10.     public User() {   
  11.     }   
  12.   
  13.     //set and get method.......   
  14. }  

User.hbm.xml:

Java代码 复制代码
  1. <?xml version="1.0"?>   
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
  4.   
  5. <hibernate-mapping>   
  6.     <class name="User" table="user" catalog="tie">   
  7.         <composite-id name="id" class="UserId"><!--is class ,not is type-->   
  8.             <key-property name="name" type="string">   
  9.                 <column name="name" />   
  10.             </key-property>   
  11.             <key-property name="addr" type="string">   
  12.                 <column name="addr" />   
  13.             </key-property>   
  14.         </composite-id>   
  15.         <property name="email" type="string">   
  16.             <column name="email" not-null="true" />   
  17.         </property>   
  18.     </class>   
  19. </hibernate-mapping>  

和复合主键唯一不同的地方就是这句: <composite-id name="id" class="UserId">

使用方法:

Java代码 复制代码
  1. public void testCreate(){   
  2.         UserId id = new UserId();   
  3.         id.setName("test1");   
  4.         id.setAddr("beijing");   
  5.         User user = new User();   
  6.         user.setId(id);   
  7.         user.setEmail("test1@163.com");   
  8.            
  9.         Session session = factroy.openSession();   
  10.         Transaction tx = session.beginTransaction();   
  11.         session.save(user);   
  12.         tx.commit();   
  13.         session.close();   
  14.            
  15.     }   
  16.        
  17.     public void testLoad(){   
  18.         UserId id = new UserId();   
  19.         id.setName("test1");   
  20.         id.setAddr("beijing");   
  21.            
  22.         Session session = factroy.openSession();   
  23.         User user = (User)session.load(User.class, id);//id是UserId对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1"));   
  24.   
  25.         System.out.println(user.getEmail());   
  26.         session.close();   
  27.            
  28.     } 
分享到:
评论

相关推荐

    Hibernate知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...

    hibernate知识点总结

    通过理解并熟练运用这些知识点,J2EE开发者能有效利用Hibernate简化数据库操作,提高开发效率,并更好地维护代码。学习Hibernate不仅有助于入门J2EE开发,也是进一步深入学习Spring Data JPA等高级技术的基础。

    Hibernate知识点总结(一).docx

    Hibernate 框架是Java开发中广泛使用的对象关系映射(ORM)工具,它简化了数据库操作,使得开发者可以通过对象模型来处理数据,无需编写大量的SQL语句。本篇文章将深入探讨Hibernate的核心概念和基本使用方法。 ...

    Struts2+Spring+Hibernate知识点总结

    ### Struts2+Spring+Hibernate知识点总结 #### Struts2框架概述 - **Struts2的工作流程**: 1. **客户端发起HTTP请求**:客户端浏览器向服务器发送HTTP请求。 2. **FilterDispatcher接收请求**:根据`web.xml`...

    hibernate知识点

    hibernate知识点的总结,适合初学者

    hibernate主要知识点

    【hibernate主要知识点】 Hibernate 是一款流行的 Java 平台上的 ORM(对象关系映射)框架,它使得开发者可以使用面向对象的方式处理数据库操作,而无需直接编写 SQL 语句。ORM 框架如 Hibernate、TopLink 和 OJB ...

    hibernate的知识总结

    Hibernate的知识点非常广泛,下面从给定文件的标题、描述、标签和部分内容中提炼出一些关键知识点进行总结。 ### Hibernate与数据库数据类型对照 Hibernate需要将Java的数据类型映射到数据库的相应类型。这部分...

    Hibernate知识总结(从入门到精通)

    **总结** Hibernate 作为一个强大的 ORM 框架,简化了数据库操作,提高了开发效率。通过理解 Hibernate 的配置、工具类使用、事务管理和数据类型映射,开发者能够更好地掌握 Hibernate,从而在实际项目中更加...

    hibernate的一份知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述及入门 **1. HelloWorld** - **目的**:通过一个简单的示例,让初学者快速上手Hibernate,理解其基本工作流程。 - **步骤**: 1. 创建Java项目,命名为`...

    Hibernate大总结/Hibernate面试题大全

    以上总结了Hibernate的一些核心概念和面试中可能遇到的关键知识点。了解这些概念有助于更好地掌握Hibernate框架的使用,以及如何高效地利用Hibernate进行数据库操作。此外,对于面试者而言,熟悉这些概念也能帮助...

    Hibernate知识总结

    以下是对 Hibernate 框架的一些核心知识点的详细说明: 1. **@Transient**: 这个注解用于标记一个属性,表明该属性不会被映射到数据库中的任何列,因此不会进行持久化。 2. **@Temporal(TemporalType.TIME)**: 此...

    hibernate知识简介.ppt

    【hibernate知识简介】 Hibernate 是一款流行的Java持久层框架,它主要负责处理对象与关系数据库之间的映射,实现对象关系映射(ORM),从而简化Java应用中的数据存取操作。ORM 解决了面向对象编程语言与关系型...

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    以下是关于Hibernate的一些关键知识点: 1. **JDBC对比Hibernate**: 传统的JDBC操作涉及手动建立和管理数据库连接,而Hibernate通过提供更高层次的抽象,自动处理这些细节,使得开发人员可以更专注于业务逻辑。 2....

    hibernate 重点知识原创

    【hibernate 重点知识】 一、hibernate 简介 Hibernate 是一个流行的 Java 应用程序框架,主要用于简化对象关系映射(ORM)的过程。它允许开发者使用面向对象的方式来操作数据库,通过自动映射数据库表为 Java ...

    hibernate的一点总结

    【hibernate的一点总结】 Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库,将Java类与数据库表进行映射,从而避免了直接编写SQL语句的繁琐工作。这个框架的核心...

    Hibernate知识整理.doc

    【Hibernate 知识整理】 1- Hibernate 是什么? Hibernate 是一个流行的对象关系映射(ORM)框架,它允许 Java 开发者用面向对象的方式来处理数据库交互。Hibernate 自动处理 SQL 转换和数据库访问,使得开发人员...

    hibernate重点总结(doc)

    一、应用程序的分层结构 二、hibernate数据持久化组件 三、持久化类 四、把持久化类映射到表 五、持久化对象(Persistent Object) 六、Hibernate中实体关系的处理 七、Hibernate知识点总结 八、Hibernate控制的事务

    Hibernate全部知识点

    ### Hibernate全部知识点解析 #### Hibernate概述 ...以上是关于Hibernate的核心知识点及其相关细节的总结。通过深入了解这些概念和技术,开发者可以更好地利用Hibernate的强大功能来构建高效、健壮的应用程序。

Global site tag (gtag.js) - Google Analytics