- 浏览: 546343 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
wa114d:
楼主工作几年了,好厉害
一个面试官对面试问题的分析 -
wobuxiaole:
Good,非常好
30岁前男人需要完成的事 -
小逗逗:
Good,非常好
30岁前男人需要完成的事 -
invincibleLiu:
好帖,要顶!(别投我隐藏啊,这是对BBS最原始一种支持)
Java:synchronized修饰符在静态方法与非静态方法上的区别 -
fayedShih:
第三题,不知道对不对
import java.util.con ...
企业牛逼面试题目 高手进来讨论答题
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();
- }
发表评论
-
Hibernate:Query.list 与 Query.iterate 的区别
2009-08-25 22:07 1587list: 结果存入缓存,但不从缓存里面取;查询时属性连同id ... -
在Hibernate中获取数据方式与缓存使用
2008-11-13 11:23 1091Hibernate获取数据的方式有不同的几种,其与缓存结合 ... -
hibernate 3中的缓存小结
2008-11-11 13:29 11552.2. 一级缓存的管 ... -
Hibernate性能优化( 四)
2008-11-07 09:23 1109在处理大数据量时,会有大量的数据缓冲保存在 Session ... -
Hibernate性能优化( 三)
2008-11-07 09:17 1149作者:Robbin Fan一。 inve ... -
Hibernate性能优化(二)
2008-11-06 17:34 906本文依照HIBERNATE帮助文档,一些网络书籍及项目经验整 ... -
Hibernate性能优化(一)
2008-11-06 13:38 1239Hibernate是一个开放源代码的对象关系映射框架,它对JD ... -
Hibernate commit() 和flush() 的区别
2008-11-06 10:28 1724Hibernate commit() 和flush() 的区别 ... -
在Hibernate中处理批量更新和批量删除
2008-11-05 17:42 1634在Hibernate中处理批量更 ... -
主题:inverse
2008-11-05 09:33 928前不久在搭建系统框架的时候遇到one-many与many-on ... -
hibernate------HQL总结
2008-11-04 13:12 1170以以个普通Users表为例: 建表语句: Java代码 ... -
hibernate 总结
2008-11-04 10:53 11401. get和load区别 load加载方法: Java代码 ... -
hibernate 批量插入
2008-11-04 10:16 1792在企业应用开发中,经常用到批量插入的功能。对于Hiberna ...
相关推荐
### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...
通过理解并熟练运用这些知识点,J2EE开发者能有效利用Hibernate简化数据库操作,提高开发效率,并更好地维护代码。学习Hibernate不仅有助于入门J2EE开发,也是进一步深入学习Spring Data JPA等高级技术的基础。
Hibernate 框架是Java开发中广泛使用的对象关系映射(ORM)工具,它简化了数据库操作,使得开发者可以通过对象模型来处理数据,无需编写大量的SQL语句。本篇文章将深入探讨Hibernate的核心概念和基本使用方法。 ...
### Struts2+Spring+Hibernate知识点总结 #### Struts2框架概述 - **Struts2的工作流程**: 1. **客户端发起HTTP请求**:客户端浏览器向服务器发送HTTP请求。 2. **FilterDispatcher接收请求**:根据`web.xml`...
hibernate知识点的总结,适合初学者
【hibernate主要知识点】 Hibernate 是一款流行的 Java 平台上的 ORM(对象关系映射)框架,它使得开发者可以使用面向对象的方式处理数据库操作,而无需直接编写 SQL 语句。ORM 框架如 Hibernate、TopLink 和 OJB ...
Hibernate的知识点非常广泛,下面从给定文件的标题、描述、标签和部分内容中提炼出一些关键知识点进行总结。 ### Hibernate与数据库数据类型对照 Hibernate需要将Java的数据类型映射到数据库的相应类型。这部分...
**总结** Hibernate 作为一个强大的 ORM 框架,简化了数据库操作,提高了开发效率。通过理解 Hibernate 的配置、工具类使用、事务管理和数据类型映射,开发者能够更好地掌握 Hibernate,从而在实际项目中更加...
### Hibernate知识点总结 #### 一、Hibernate概述及入门 **1. HelloWorld** - **目的**:通过一个简单的示例,让初学者快速上手Hibernate,理解其基本工作流程。 - **步骤**: 1. 创建Java项目,命名为`...
以上总结了Hibernate的一些核心概念和面试中可能遇到的关键知识点。了解这些概念有助于更好地掌握Hibernate框架的使用,以及如何高效地利用Hibernate进行数据库操作。此外,对于面试者而言,熟悉这些概念也能帮助...
以下是对 Hibernate 框架的一些核心知识点的详细说明: 1. **@Transient**: 这个注解用于标记一个属性,表明该属性不会被映射到数据库中的任何列,因此不会进行持久化。 2. **@Temporal(TemporalType.TIME)**: 此...
【hibernate知识简介】 Hibernate 是一款流行的Java持久层框架,它主要负责处理对象与关系数据库之间的映射,实现对象关系映射(ORM),从而简化Java应用中的数据存取操作。ORM 解决了面向对象编程语言与关系型...
以下是关于Hibernate的一些关键知识点: 1. **JDBC对比Hibernate**: 传统的JDBC操作涉及手动建立和管理数据库连接,而Hibernate通过提供更高层次的抽象,自动处理这些细节,使得开发人员可以更专注于业务逻辑。 2....
【hibernate 重点知识】 一、hibernate 简介 Hibernate 是一个流行的 Java 应用程序框架,主要用于简化对象关系映射(ORM)的过程。它允许开发者使用面向对象的方式来操作数据库,通过自动映射数据库表为 Java ...
【hibernate的一点总结】 Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库,将Java类与数据库表进行映射,从而避免了直接编写SQL语句的繁琐工作。这个框架的核心...
【Hibernate 知识整理】 1- Hibernate 是什么? Hibernate 是一个流行的对象关系映射(ORM)框架,它允许 Java 开发者用面向对象的方式来处理数据库交互。Hibernate 自动处理 SQL 转换和数据库访问,使得开发人员...
一、应用程序的分层结构 二、hibernate数据持久化组件 三、持久化类 四、把持久化类映射到表 五、持久化对象(Persistent Object) 六、Hibernate中实体关系的处理 七、Hibernate知识点总结 八、Hibernate控制的事务
### Hibernate全部知识点解析 #### Hibernate概述 ...以上是关于Hibernate的核心知识点及其相关细节的总结。通过深入了解这些概念和技术,开发者可以更好地利用Hibernate的强大功能来构建高效、健壮的应用程序。