hibernate源码
① 关于spring整合hibernate的时候自动创建表的问题
<prop key="hibernate.hbm2ddl.auto">update</prop>
漏了"hibernate",若没写全会被框架认为没配置,所以不会导出schema;
关于update和create:
(1)update 但schema发生改变时进行更新,比如添加字段,保留原有数据;
(2)create 每次运行重新创建schema,如果表存在,先删除再创建,原有数据丢失;
update也会创建表,以下是配置>update<执行的代码(hibernate的源码):
if ( table.isPhysicalTable() ) {
TableMetadata tableInfo = databaseMetadata.getTableMetadata(
table.getName(),
( table.getSchema() == null ) ? defaultSchema : table.getSchema(),
( table.getCatalog() == null ) ? defaultCatalog : table.getCatalog(), table.isQuoted()
);
if ( tableInfo == null ) {
script.add(
table.sqlCreateString(
dialect,
mapping,
defaultCatalog, defaultSchema
)
);
}
else {
Iterator<String> subiter = table.sqlAlterStrings(
dialect,
mapping,
tableInfo,
defaultCatalog,
defaultSchema
);
while ( subiter.hasNext() ) {
script.add( subiter.next() );
}
}
Iterator<String> comments = table.sqlCommentStrings( dialect, defaultCatalog, defaultSchema );
while ( comments.hasNext() ) {
script.add( comments.next() );
}
}
}
表若不存在,也会被创建.
② nhibernate是如何自动生成sql语句的
NHibernate 查看生成的sql语句:
其实就是Interceptor的应用, 源码中Interceptor的默认实现是EmptyInterceptor,
[Serializable]
public class EmptyInterceptor : IInterceptor
{ //前面省略n行代码
public SqlString OnPrepareStatement(SqlString sql)
{
return sql;
}
} public class MyInterceptor : EmptyInterceptor
{
public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
{
return base.OnPrepareStatement(sql);
}
} 我们要做的就是继承EmptyInterceptor,重写OnPrepareStatement()方法,重写方法里面就是你大展拳脚的地方了,
想写文件写文件,想输出到页面就输出到页面,什么都不做都可以,如上
怎么用呢?
public override void Update(Admin entity)
{
ISession session = HibernateTemplate.SessionFactory.OpenSession(new MyIntercepotr);
session.Update(entity);
session.Flush();
}
在你想要查看的操作中,打开session 的时候添加上自定义的拦截器就可以了,想给所有的操作都配置的话就要用到全局配置文件了。
重写OnPrepareStatement()的时候一句话都不改,我只是在这里打一个断点而已,只要看看生成的sql语句就行了,然后去修改配置文件再来debug,确认怎么配置生产的sql最优。
用LinqPad查看Nhibernate生成的sql语句
使用Nhibernate开发一般都要对Nhibernate生成的sql语句进行查看及分析,查看Nhibernate生成的sql语句,可以使用NHProfiler和log4net。但NHProfiler是要付费的(当然,在天朝,你懂的……),用log4net配置比较麻烦。今天在网上查看Linq to Nhibernate资料的时候发现了一个工具LinqPad,于是又找了相关资源,发现它还真能实现Nhibenate语句的查看。废话少说,看下面的使用方法吧!
1、 下载LinqPad,地址:http://www.linqpad.net/
2、 配置LinqPad,运行LinqPad,在菜单里选择Query—>Query Propeties;在选项卡中Additional References,点击“Browse…”按钮,选择项目中必要的Dll。
Dll包括:数据库驱动dll,实体映射dll(图中的Entity),nhibernate相关的dll
③ hibernate session.save()怎么实现底层代码怎么看求告诉
不得不说,你截图里的这个箭头指的很帅!
我来解答一下,你先在你的代码里面,有session.save(obj)调用的地方,按下Ctrl键,然后把鼠标移动到save上(注意不要点下去),会出现一个小菜单,如下图:
看到没,上面的注释里说的,save() operations,这里的三个方法之间的调用关系,就说明这三个方法就是hibernate的session.save(obj)方法的实现所做的操作了。
不过真心不明白你看这个代码做什么,如果是你保存不成功的话,一般hibernate这种老牌框架是不会出问题的,原因在你自己代码上;如果你想研究hibernate源代码,进而自己写一个ORM框架,算我没说。
④ Hibernate官网下载
Hibernate官网下载地址是:[Hibernate官网下载页面链接]。
Hibernate是一个开源的Java对象关系映射(ORM)框架,它提供了Java应用程序与关系型数据库之间的映射功能,使得Java开发者可以使用面向对象的方式来操作数据库。Hibernate通过配置文件和注解来映射Java对象与数据库表之间的关系,使得开发者无需编写繁琐的SQL语句就可以完成数据的增删改查操作。
在Hibernate的官网上,你可以找到Hibernate的最新版本下载链接。通常,Hibernate会提供两个版本的下载:一个是包含完整源代码的版本,另一个是只包含编译后的JAR文件的版本。你可以根据自己的需求选择适合的版本进行下载。
下载Hibernate后,你需要将其添加到你的Java项目中,并配置相关的配置文件。配置文件通常包括hibernate.cfg.xml和hbm.xml文件。hibernate.cfg.xml文件用于配置Hibernate的全局信息,如数据库连接信息、方言等;而hbm.xml文件则用于配置Java对象与数据库表之间的映射关系。
一旦配置完成,你就可以在你的Java代码中使用Hibernate提供的API来操作数据库了。例如,你可以使用SessionFactory类创建Session对象,然后通过Session对象来执行数据库操作。Hibernate的API提供了丰富的功能,如事务管理、查询语句构建等,使得开发者能够更加方便地操作数据库。
总之,通过访问Hibernate的官网并下载适合的版本,你可以轻松地将Hibernate集成到你的Java项目中,并利用其强大的ORM功能来简化数据库操作。记得在下载和使用Hibernate时,查阅官方文档以获取更详细的使用说明和最佳实践建议。
⑤ hibernate是什么
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Hibernate的核心类和接口一共有6个,分别为:Session、SessionFactory、
Transaction、Query、Criteria和Configuration。这6个核心类和接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
Session:
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
SessionFactory:
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Transaction:
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Query:
Query接口让使用者方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
Criteria:
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
Configuration:
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。