`
ttitfly
  • 浏览: 623920 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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
org.hibernate.classic.Session session = factory.openSession();
session.find("from User");

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

例子如下:
A:
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:
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
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

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="User" table="user" catalog="tie">
        <composite-id>
            <key-property name="name" type="string">
                <column name="name" />
            </key-property>
            <key-property name="addr" type="string">
                <column name="addr" />
            </key-property>
        </composite-id>
        <property name="email" type="string">
            <column name="email" not-null="true" />
        </property>
    </class>
</hibernate-mapping>


使用方法:
	public void testCreate(){

		User user = new User();
		user.setName("test1");
		user.setAddr("beijing");
		user.setEmail("test1@xx.com");
		
		Session session = factroy.openSession();
		Transaction tx = session.beginTransaction();
		session.save(user);
		tx.commit();
		session.close();
	}
	
	public void testLoad(){
		
		User user = new User();
		user.setName("test1");
		user.setAddr("beijing");
		Session session = factroy.openSession();
		user = (User)session.load(User.class, user);//这里是user对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1"));
		System.out.println(user.getEmail());
		
	}


第二种方式:复合主键单独作为一个对象
UserId.java
/**
必须实现Serializable 接口,重写hashCode 方法和equals函数
*/
public class UserId  implements java.io.Serializable {

     private String name;
     private String addr;

    public UserId() {
    }

    public UserId(String name, String addr) {
        this.name = name;
        this.addr = addr;
    }


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

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



   public boolean equals(Object other) {
         if ( (this == other ) ) return true;
		 if ( (other == null ) ) return false;
		 if ( !(other instanceof UserId) ) return false;
		 UserId castOther = ( UserId ) other; 
         
		return new EqualsBuilder().append(this.getName(), castOther.getName())
				.append(this.getAddr(), castOther.getAddr()).isEquals();
   }
   
   public int hashCode() {
         return new HashCodeBuilder().append(this.getName()).append(
				this.getAddr()).toHashCode();
   }   

}

User.java:

/**
该类不需要实现Serializable接口,也不需要重写equals和hashCode方法
*/
public class User{
	private UserId id;

	private String email;

	
	public User() {
	}

	//set and get method.......
}


User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="User" table="user" catalog="tie">
        <composite-id name="id" class="UserId"><!--is class ,not is type-->
            <key-property name="name" type="string">
                <column name="name" />
            </key-property>
            <key-property name="addr" type="string">
                <column name="addr" />
            </key-property>
        </composite-id>
        <property name="email" type="string">
            <column name="email" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

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

使用方法:
public void testCreate(){
		UserId id = new UserId();
		id.setName("test1");
		id.setAddr("beijing");
		User user = new User();
		user.setId(id);
		user.setEmail("test1@163.com");
		
		Session session = factroy.openSession();
		Transaction tx = session.beginTransaction();
		session.save(user);
		tx.commit();
		session.close();
		
	}
	
	public void testLoad(){
		UserId id = new UserId();
		id.setName("test1");
		id.setAddr("beijing");
		
		Session session = factroy.openSession();
		User user = (User)session.load(User.class, id);//id是UserId对象,非复合主键则是:User user = (User)session.load(User.class, new Long("1"));

		System.out.println(user.getEmail());
		session.close();
		
	}
分享到:
评论
2 楼 liliugen 2008-11-04  
看了这篇文章我觉得收益蛮多的,回帖下,thanks
1 楼 410228573 2008-08-14  
谢谢!!正好delete那个地方没弄懂!以为delete之后还是持久态!!现在基本弄清三个状态了。

相关推荐

    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关联映射总结

    ### Hibernate关联映射总结 #### 一、基础知识 在探讨Hibernate中的关联映射之前,我们需要先理解几个基本概念,这将有助于我们更好地理解和应用这些关联映射。 - **主键**(Primary Key):主键是用来唯一标识一...

    Hibernate知识整理.doc

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

    hibernate重点总结(doc)

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

Global site tag (gtag.js) - Google Analytics