- 浏览: 19237 次
- 性别:
- 来自: 北京
最新评论
-
fu80008:
flex的namespace
关于Flex的DataGrid的应用拓展(一) -
zyx870805:
xmlns:local="*"
请问这句话 ...
关于Flex的DataGrid的应用拓展(一) -
zhouzhibo:
写得不错,顶
从应用角度看Hibernate源码(一):Hibernate配置文件 -
fu80008:
对于缓存的运用,大家可以去参考相关的书籍,在应用方面Hiber ...
从应用角度看Hibernate源码(二):Hibernate缓存 -
fu80008:
以上代码非常的简单,开始先声明一个容器:
private f ...
从应用角度看Hibernate源码(二):Hibernate缓存
Hibernate可以说伴随着我的整个Java历程。从我一开始工作,我就在一次意外的机会认识了它。以前,在使用语言上我是非常激进的。因为公司不采用Hibernate,我辞去了两份工作。可今天我们搞门户网站的时候,我却第一个反对使用Hibernate。总之,Hibernate让我彻夜难眠。
刚开始接触Hibernate时,自然就要接触Hibernate配置文件,众所周知,Hibernate有两种配置模式:一个采用属性文件,一个采用XML配置文件。一般在早期Hibernate2时,大家都喜欢采用属性文件,现在大家都喜欢用XML配置文件。现在不妨贴一段基本XML配置给大家看看:
java 代码
- <?xml version='1.0' encoding='UTF-8'?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <!-- Generated by MyEclipse Hibernate Tools. -->
- <hibernate-configuration>
- <session-factory>
- <property name="dialect">
- org.hibernate.dialect.MySQLDialect
- </property>
- <property name="connection.url">
- jdbc:mysql://localhost:3306/hibtest
- </property>
- <property name="connection.username">root</property>
- <property name="connection.driver_class">
- com.mysql.jdbc.Driver
- </property>
- <property name="hibernate.fetch">true</property>
- <property name="hibernate.show_sql">true</property>
- <property name="hibernate.cache.use_query_cache">true</property>
- <property name="hibernate.cache.provider_class">
- org.hibernate.cache.EhCacheProvider
- </property>
- <mapping resource="hib/pojo/Canguan.hbm.xml" />
- <mapping resource="hib/pojo/Kecheng.hbm.xml" />
- <mapping resource="hib/pojo/Reply.hbm.xml" />
- <mapping resource="com/edong/pojo/SongGame.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
上面这段代码,在一般的Hibernate使用者来说再也普通不过了。但如果从本质上去看待这些文件,能够看到很多内容。
(1)作为一个XML首先要注意的就是它的结构。 Hibernate 结构是由hibernate-configuration-3.0.dtd决定的。打开dtd文件自然就可以看到dtd结构。由于篇幅限制,读者可以在源码的src\org\hibernate目录下找到该文件。如果用户对这些dtd不熟悉,可以去看源码\etc目录下的配置demo。如果你还觉得不够, 可以采用Eclipse的提示去达到自己的目的。
(2)大家要注意的是,作为一个配置文件开始的第一个标签是不动的。同样对于以上的配置文件来说,<hibernate-configuration>元素是全局元素。
先吃饭去了,过会儿再继续
评论
20 楼
zhouzhibo
2007-12-04
写得不错,顶
19 楼
javachs
2007-10-10
写的不错,顶,眼高手低者务扰。
18 楼
fu80008
2007-10-09
谢谢,兄台的关注。
17 楼
fuwang
2007-10-09
不是啊,我觉得你写得很好,那个投隐藏的太可耻了。
你写了这么多条,全部都切合"从应用角度看hibernate源码"的主题,虽然有几条稍微浅显点,但总的来说,对那些刚入门者、甚至用了几年hibernate的人都极具启发意义。当然,对于那些"不屑编码"者,"忽悠"者,确实没有用。我觉得这是篇很好的帖子,希望楼主继续(可另开帖)。
还有我建议你再开专栏时,尽量把前面几楼、甚至首页自己给占了,免得让别人说废话,影响气氛。
你写了这么多条,全部都切合"从应用角度看hibernate源码"的主题,虽然有几条稍微浅显点,但总的来说,对那些刚入门者、甚至用了几年hibernate的人都极具启发意义。当然,对于那些"不屑编码"者,"忽悠"者,确实没有用。我觉得这是篇很好的帖子,希望楼主继续(可另开帖)。
还有我建议你再开专栏时,尽量把前面几楼、甚至首页自己给占了,免得让别人说废话,影响气氛。
16 楼
fu80008
2007-10-09
大哥,就这样吧。别难为我了,你要是觉得合适你也可以去开辟一个专栏试试。
15 楼
fuwang
2007-10-09
你怎么能说别人不懂hibernate呢,几百万上千万的项目都是这样的人做出来的!
14 楼
fu80008
2007-10-09
好酒不怕巷子深。只要是好东西,会有人发现的。至于Hibernate的优劣,也懒得去讨论了,一般没有什么结果。就是一帮不懂的人在瞎侃。没劲
这个帖子就写到这儿吧,如果有什么好的思想,大家可以来补充。
这个帖子就写到这儿吧,如果有什么好的思想,大家可以来补充。
13 楼
myyate
2007-10-09
奇怪,这个帖子写的还可以吧,怎么投隐藏了?
12 楼
fuwang
2007-10-09
fu80008 写道
这个帖子,不是对Hibernate性能的讨论,这里只做简单的介绍。Hibernate有很多致命的弱点。最重要的是Hibernate是单库(可以说单实例)解决方案。尽管Hibernate现在除了一个新的多库解决方案。但目前是不成熟的。
就写这么多吧。我怕引发争议,偏离了主题。
就写这么多吧。我怕引发争议,偏离了主题。
我也觉得这是hibernate一个很值得讨论的问题。
你能否以此为主题另开新贴,让高手们都来参与一下。
11 楼
fu80008
2007-10-08
(7)这个文件是怎样被加载到Hibernate的处理系统的呢?是通过org.hibernate.cfg.Configuration的。请看下面源码(只解释几个重要的方法)
这个配置文件是是序列化的,其实Hibernate把全局的类对象都给序列化了。
这个方法是我们不常用的方法,用于加载jar包里面*.hbm.xml文件。其实我们从中学到的不仅仅是Hibernate的一个功能,而是学到了如何对Jar文件进行合理的操作。如果有一天需要对jar文件进行操作,到Hibernate源码里看看就行了。
public class Configuration implements Serializable { ...... }
这个配置文件是是序列化的,其实Hibernate把全局的类对象都给序列化了。
public Configuration addJar(File jar) throws MappingException { log.info( "Searching for mapping documents in jar: " + jar.getName() ); JarFile jarFile = null; try { try { jarFile = new JarFile( jar ); } catch (IOException ioe) { throw new InvalidMappingException( "Could not read mapping documents from jar: " + jar.getName(), "jar", jar.getName(), ioe ); } Enumeration jarEntries = jarFile.entries(); while ( jarEntries.hasMoreElements() ) { ZipEntry ze = (ZipEntry) jarEntries.nextElement(); if ( ze.getName().endsWith( ".hbm.xml" ) ) { log.info( "Found mapping document in jar: " + ze.getName() ); try { addInputStream( jarFile.getInputStream( ze ) ); } catch (Exception e) { throw new InvalidMappingException( "Could not read mapping documents from jar: " + jar.getName(), "jar", jar.getName(), e ); } } } } finally { try { if ( jarFile != null ) { jarFile.close(); } } catch (IOException ioe) { log.error("could not close jar", ioe); } } return this; }
这个方法是我们不常用的方法,用于加载jar包里面*.hbm.xml文件。其实我们从中学到的不仅仅是Hibernate的一个功能,而是学到了如何对Jar文件进行合理的操作。如果有一天需要对jar文件进行操作,到Hibernate源码里看看就行了。
10 楼
fu80008
2007-10-08
这个帖子,不是对Hibernate性能的讨论,这里只做简单的介绍。Hibernate有很多致命的弱点。最重要的是Hibernate是单库(可以说单实例)解决方案。尽管Hibernate现在除了一个新的多库解决方案。但目前是不成熟的。
就写这么多吧。我怕引发争议,偏离了主题。
就写这么多吧。我怕引发争议,偏离了主题。
9 楼
fuwang
2007-10-08
感谢你讲了一些一般人不会注意而实际上很有用的东西,但大家最关心的是你为什么反对在门户网站使用Hibernate。
8 楼
fu80008
2007-10-08
javachs 写道
secondPassCompile();
这句话啥意思,我看源码时没找到出处。
我用的是版本3.2,源码是这样
protected void secondPassCompile() throws MappingException { log.debug( "processing extends queue" ); processExtendsQueue(); log.debug( "processing collection mappings" ); Iterator iter = secondPasses.iterator(); while ( iter.hasNext() ) { SecondPass sp = (SecondPass) iter.next(); if ( ! (sp instanceof QuerySecondPass) ) { sp.doSecondPass( classes ); iter.remove(); } } log.debug( "processing native query and ResultSetMapping mappings" ); iter = secondPasses.iterator(); while ( iter.hasNext() ) { SecondPass sp = (SecondPass) iter.next(); sp.doSecondPass( classes ); iter.remove(); } log.debug( "processing association property references" ); iter = propertyReferences.iterator(); while ( iter.hasNext() ) { Mappings.PropertyReference upr = (Mappings.PropertyReference) iter.next(); PersistentClass clazz = getClassMapping( upr.referencedClass ); if ( clazz == null ) { throw new MappingException( "property-ref to unmapped class: " + upr.referencedClass ); } Property prop = clazz.getReferencedProperty( upr.propertyName ); if ( upr.unique ) { ( (SimpleValue) prop.getValue() ).setAlternateUniqueKey( true ); } } //TODO: Somehow add the newly created foreign keys to the internal collection log.debug( "processing foreign key constraints" ); iter = getTableMappings(); Set done = new HashSet(); while ( iter.hasNext() ) { secondPassCompileForeignKeys( (Table) iter.next(), done ); } }
意图非常的明显,重新加载各种属性,在源码中被多次用到。
7 楼
fu80008
2007-10-08
让我再去吃点东西吧,领导老瞄着我的屏幕。哈哈
6 楼
fu80008
2007-10-08
(6)打开org.hibernate.Dialect目录还有一件让人兴奋的事情。Hibernate对Mysql的数据库作了区分,如MySQL5Dialect、MySQLDialect、MySQLInnoDBDialect等等。打开MySQL5Dialect代码
从以上代码,你可以知道,MySQL4和MySQL5之间有什么区别。更重要的它告诉了你,Hibernate Dialect是可以扩展的。只要你继承自己所需要的方言就可以扩展自己的函数,或者Mysql方言没有注册的MySQL函数。
public class MySQL5Dialect extends MySQLDialect { protected void registerVarcharTypes() { registerColumnType( Types.VARCHAR, "longtext" ); registerColumnType( Types.VARCHAR, 16777215, "mediumtext" ); registerColumnType( Types.VARCHAR, 65535, "varchar($l)" ); } }
从以上代码,你可以知道,MySQL4和MySQL5之间有什么区别。更重要的它告诉了你,Hibernate Dialect是可以扩展的。只要你继承自己所需要的方言就可以扩展自己的函数,或者Mysql方言没有注册的MySQL函数。
5 楼
fu80008
2007-10-08
(4)SessionFacotry相信大家都用过。在配置时,往往因找不到下面的属性配置,而在网络上东找西找。其实非常简单,只需要打开源码下的\etc\hibernate.properties,真是要啥有啥。而且肯定不用怀疑是否准确。同时Hibernate支持多少种数据库也尽收眼底。
(5)介绍一个重要的属性-dialect。做数据库语句查询时,大家都知道dialect是数据库的方言,但是,当不知道一个Hibernate的HQL函数而抓耳挠腮时,却不知道打开Hibernate方言看看。打开Hibernate所对用的方言。会发现里面挂满了Hibernate所能支持函数的全部。不相信看看如下的Mysql的方言。
看到这些,如果你不是很笨,应该明白是怎么一回事了吧。
(5)介绍一个重要的属性-dialect。做数据库语句查询时,大家都知道dialect是数据库的方言,但是,当不知道一个Hibernate的HQL函数而抓耳挠腮时,却不知道打开Hibernate方言看看。打开Hibernate所对用的方言。会发现里面挂满了Hibernate所能支持函数的全部。不相信看看如下的Mysql的方言。
public MySQLDialect() { super(); registerColumnType( Types.BIT, "bit" ); registerColumnType( Types.BIGINT, "bigint" ); registerColumnType( Types.SMALLINT, "smallint" ); registerColumnType( Types.TINYINT, "tinyint" ); registerColumnType( Types.INTEGER, "integer" ); registerColumnType( Types.CHAR, "char(1)" ); registerColumnType( Types.FLOAT, "float" ); registerColumnType( Types.DOUBLE, "double precision" ); registerColumnType( Types.DATE, "date" ); registerColumnType( Types.TIME, "time" ); registerColumnType( Types.TIMESTAMP, "datetime" ); registerColumnType( Types.VARBINARY, "longblob" ); registerColumnType( Types.VARBINARY, 16777215, "mediumblob" ); registerColumnType( Types.VARBINARY, 65535, "blob" ); registerColumnType( Types.VARBINARY, 255, "tinyblob" ); registerColumnType( Types.NUMERIC, "numeric($p,$s)" ); registerColumnType( Types.BLOB, "longblob" ); registerColumnType( Types.BLOB, 16777215, "mediumblob" ); registerColumnType( Types.BLOB, 65535, "blob" ); registerColumnType( Types.CLOB, "longtext" ); registerColumnType( Types.CLOB, 16777215, "mediumtext" ); registerColumnType( Types.CLOB, 65535, "text" ); registerVarcharTypes(); registerFunction("ascii", new StandardSQLFunction("ascii", Hibernate.INTEGER) ); registerFunction("bin", new StandardSQLFunction("bin", Hibernate.STRING) ); registerFunction("char_length", new StandardSQLFunction("char_length", Hibernate.LONG) ); registerFunction("character_length", new StandardSQLFunction("character_length", Hibernate.LONG) ); registerFunction("lcase", new StandardSQLFunction("lcase") ); registerFunction("lower", new StandardSQLFunction("lower") ); registerFunction("length", new StandardSQLFunction("length", Hibernate.LONG) ); registerFunction("ltrim", new StandardSQLFunction("ltrim") ); registerFunction("ord", new StandardSQLFunction("ord", Hibernate.INTEGER) ); registerFunction("quote", new StandardSQLFunction("quote") ); registerFunction("reverse", new StandardSQLFunction("reverse") ); registerFunction("rtrim", new StandardSQLFunction("rtrim") ); registerFunction("soundex", new StandardSQLFunction("soundex") ); registerFunction("space", new StandardSQLFunction("space", Hibernate.STRING) ); registerFunction("ucase", new StandardSQLFunction("ucase") ); registerFunction("upper", new StandardSQLFunction("upper") ); registerFunction("unhex", new StandardSQLFunction("unhex", Hibernate.STRING) ); registerFunction("abs", new StandardSQLFunction("abs") ); registerFunction("sign", new StandardSQLFunction("sign", Hibernate.INTEGER) ); registerFunction("acos", new StandardSQLFunction("acos", Hibernate.DOUBLE) ); registerFunction("asin", new StandardSQLFunction("asin", Hibernate.DOUBLE) ); registerFunction("atan", new StandardSQLFunction("atan", Hibernate.DOUBLE) ); registerFunction("cos", new StandardSQLFunction("cos", Hibernate.DOUBLE) ); registerFunction("cot", new StandardSQLFunction("cot", Hibernate.DOUBLE) ); registerFunction("crc32", new StandardSQLFunction("crc32", Hibernate.LONG) ); registerFunction("exp", new StandardSQLFunction("exp", Hibernate.DOUBLE) ); registerFunction("ln", new StandardSQLFunction("ln", Hibernate.DOUBLE) ); registerFunction("log", new StandardSQLFunction("log", Hibernate.DOUBLE) ); registerFunction("log2", new StandardSQLFunction("log2", Hibernate.DOUBLE) ); registerFunction("log10", new StandardSQLFunction("log10", Hibernate.DOUBLE) ); registerFunction("pi", new NoArgSQLFunction("pi", Hibernate.DOUBLE) ); registerFunction("rand", new NoArgSQLFunction("rand", Hibernate.DOUBLE) ); registerFunction("sin", new StandardSQLFunction("sin", Hibernate.DOUBLE) ); registerFunction("sqrt", new StandardSQLFunction("sqrt", Hibernate.DOUBLE) ); registerFunction("tan", new StandardSQLFunction("tan", Hibernate.DOUBLE) ); registerFunction("radians", new StandardSQLFunction("radians", Hibernate.DOUBLE) ); registerFunction("degrees", new StandardSQLFunction("degrees", Hibernate.DOUBLE) ); registerFunction("ceiling", new StandardSQLFunction("ceiling", Hibernate.INTEGER) ); registerFunction("ceil", new StandardSQLFunction("ceil", Hibernate.INTEGER) ); registerFunction("floor", new StandardSQLFunction("floor", Hibernate.INTEGER) ); registerFunction("round", new StandardSQLFunction("round", Hibernate.INTEGER) ); registerFunction("datediff", new StandardSQLFunction("datediff", Hibernate.INTEGER) ); registerFunction("timediff", new StandardSQLFunction("timediff", Hibernate.TIME) ); registerFunction("date_format", new StandardSQLFunction("date_format", Hibernate.STRING) ); registerFunction("curdate", new NoArgSQLFunction("curdate", Hibernate.DATE) ); registerFunction("curtime", new NoArgSQLFunction("curtime", Hibernate.TIME) ); registerFunction("current_date", new NoArgSQLFunction("current_date", Hibernate.DATE, false) ); registerFunction("current_time", new NoArgSQLFunction("current_time", Hibernate.TIME, false) ); registerFunction("current_timestamp", new NoArgSQLFunction("current_timestamp", Hibernate.TIMESTAMP, false) ); registerFunction("date", new StandardSQLFunction("date", Hibernate.DATE) ); registerFunction("day", new StandardSQLFunction("day", Hibernate.INTEGER) ); registerFunction("dayofmonth", new StandardSQLFunction("dayofmonth", Hibernate.INTEGER) ); registerFunction("dayname", new StandardSQLFunction("dayname", Hibernate.STRING) ); registerFunction("dayofweek", new StandardSQLFunction("dayofweek", Hibernate.INTEGER) ); registerFunction("dayofyear", new StandardSQLFunction("dayofyear", Hibernate.INTEGER) ); registerFunction("from_days", new StandardSQLFunction("from_days", Hibernate.DATE) ); registerFunction("from_unixtime", new StandardSQLFunction("from_unixtime", Hibernate.TIMESTAMP) ); registerFunction("hour", new StandardSQLFunction("hour", Hibernate.INTEGER) ); registerFunction("last_day", new StandardSQLFunction("last_day", Hibernate.DATE) ); registerFunction("localtime", new NoArgSQLFunction("localtime", Hibernate.TIMESTAMP) ); registerFunction("localtimestamp", new NoArgSQLFunction("localtimestamp", Hibernate.TIMESTAMP) ); registerFunction("microseconds", new StandardSQLFunction("microseconds", Hibernate.INTEGER) ); registerFunction("minute", new StandardSQLFunction("minute", Hibernate.INTEGER) ); registerFunction("month", new StandardSQLFunction("month", Hibernate.INTEGER) ); registerFunction("monthname", new StandardSQLFunction("monthname", Hibernate.STRING) ); registerFunction("now", new NoArgSQLFunction("now", Hibernate.TIMESTAMP) ); registerFunction("quarter", new StandardSQLFunction("quarter", Hibernate.INTEGER) ); registerFunction("second", new StandardSQLFunction("second", Hibernate.INTEGER) ); registerFunction("sec_to_time", new StandardSQLFunction("sec_to_time", Hibernate.TIME) ); registerFunction("sysdate", new NoArgSQLFunction("sysdate", Hibernate.TIMESTAMP) ); registerFunction("time", new StandardSQLFunction("time", Hibernate.TIME) ); registerFunction("timestamp", new StandardSQLFunction("timestamp", Hibernate.TIMESTAMP) ); registerFunction("time_to_sec", new StandardSQLFunction("time_to_sec", Hibernate.INTEGER) ); registerFunction("to_days", new StandardSQLFunction("to_days", Hibernate.LONG) ); registerFunction("unix_timestamp", new StandardSQLFunction("unix_timestamp", Hibernate.LONG) ); registerFunction("utc_date", new NoArgSQLFunction("utc_date", Hibernate.STRING) ); registerFunction("utc_time", new NoArgSQLFunction("utc_time", Hibernate.STRING) ); registerFunction("utc_timestamp", new NoArgSQLFunction("utc_timestamp", Hibernate.STRING) ); registerFunction("week", new StandardSQLFunction("week", Hibernate.INTEGER) ); registerFunction("weekday", new StandardSQLFunction("weekday", Hibernate.INTEGER) ); registerFunction("weekofyear", new StandardSQLFunction("weekofyear", Hibernate.INTEGER) ); registerFunction("year", new StandardSQLFunction("year", Hibernate.INTEGER) ); registerFunction("yearweek", new StandardSQLFunction("yearweek", Hibernate.INTEGER) ); registerFunction("hex", new StandardSQLFunction("hex", Hibernate.STRING) ); registerFunction("oct", new StandardSQLFunction("oct", Hibernate.STRING) ); registerFunction("octet_length", new StandardSQLFunction("octet_length", Hibernate.LONG) ); registerFunction("bit_length", new StandardSQLFunction("bit_length", Hibernate.LONG) ); registerFunction("bit_count", new StandardSQLFunction("bit_count", Hibernate.LONG) ); registerFunction("encrypt", new StandardSQLFunction("encrypt", Hibernate.STRING) ); registerFunction("md5", new StandardSQLFunction("md5", Hibernate.STRING) ); registerFunction("sha1", new StandardSQLFunction("sha1", Hibernate.STRING) ); registerFunction("sha", new StandardSQLFunction("sha", Hibernate.STRING) ); registerFunction( "concat", new StandardSQLFunction( "concat", Hibernate.STRING ) ); getDefaultProperties().setProperty(Environment.MAX_FETCH_DEPTH, "2"); getDefaultProperties().setProperty(Environment.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE); }
看到这些,如果你不是很笨,应该明白是怎么一回事了吧。
4 楼
javachs
2007-10-08
secondPassCompile();
这句话啥意思,我看源码时没找到出处。
3 楼
javachs
2007-10-08
把你前后对hibernate的态度的巨大变化讲一下,是啥让你变了心。
2 楼
fu80008
2007-10-08
幸亏楼上的老兄提醒。这才发现自己吃了一天了,终于,吃饱了,喝足了。接着说。哈哈!
续:如果发现开始元素不唯一,建议拆分成多个文件。
(3)通过观察环境dtd文件你会发现,<session-factory>元素是唯一的。这就表明一个配置文件可以创建一个sessionFacotry,也同时表示一个配置环境中可以连接一个的数据库。如果不放心,可以去看org.hibernate.cfg.Configuration下的
这个方法在配置文件下,不带参数创建SessionFactory,肯定表明是唯一性。
续:如果发现开始元素不唯一,建议拆分成多个文件。
(3)通过观察环境dtd文件你会发现,<session-factory>元素是唯一的。这就表明一个配置文件可以创建一个sessionFacotry,也同时表示一个配置环境中可以连接一个的数据库。如果不放心,可以去看org.hibernate.cfg.Configuration下的
public SessionFactory buildSessionFactory() throws HibernateException { log.debug( "Preparing to build session factory with filters : " + filterDefinitions ); secondPassCompile(); validate(); Environment.verifyProperties( properties ); Properties copy = new Properties(); copy.putAll( properties ); PropertiesHelper.resolvePlaceHolders( copy ); Settings settings = buildSettings( copy ); return new SessionFactoryImpl( this, mapping, settings, getInitializedEventListeners() ); }
这个方法在配置文件下,不带参数创建SessionFactory,肯定表明是唯一性。
1 楼
zhufanamo
2007-10-08
你吃了一天了?
相关推荐
- Configuration:配置对象,负责读取Hibernate配置文件(hibernate.cfg.xml),设置连接信息等。 - SessionFactory:会话工厂,根据Configuration对象生成,是线程安全的,用于创建Session实例。 - Session:...
本篇文章将探讨“Hibernate学习一:简单应用1配置文件版”,主要涵盖如何配置Hibernate,创建实体类,以及进行基本的CRUD操作。 首先,我们来了解Hibernate的核心配置文件——`hibernate.cfg.xml`。这个文件包含了...
《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...
配置文件:只配置父类的映射文件,在其中加入joined-subclass将两个子类实体映射关系添加 2) 数据库表:一张表,包括公共字段、特有字段、区分字段 实体层设计:与第一种方法设计一样,设计三个实体类,分父类和...
标题"hibernate源码 直接使用"表明我们将探讨的是Hibernate框架的源代码,以及如何直接在项目中应用这些源代码。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,将数据库交互转化为面向...
在深入探讨Hibernate源码之前,我们首先需要理解什么是对象持久化技术。对象持久化是将内存中的对象状态保存到持久存储介质(如数据库)中,以便在后续的程序运行中可以恢复这些对象的状态。它解决了应用程序中的...
标题"传智播客hibernate源码"暗示了这是一个关于Hibernate框架的源代码学习资源,可能包含了对Hibernate框架内部机制的深入解析,以及如何在实际项目中应用Hibernate的相关示例。 描述中的内容重复,进一步确认了这...
【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...
压缩包文件“hibernate_cache_level1”可能包含与一级缓存相关的示例代码、配置文件或文档,可以帮助开发者更深入地理解一级缓存的实现和优化。例如,其中可能有示例展示了如何配置SessionFactory的缓存区域大小,...
7. **逆向工程**:Hibernate Tools支持从现有数据库生成Java实体类和映射文件,这在快速构建数据驱动的应用时非常有用。 8. **代码生成**:它可以根据实体类自动生成DAO和Service层的模板代码,减少手动编写的工作...
本文将从多个角度探讨Hibernate源码中的核心概念和实现机制。 1. **持久化模型设计** Hibernate通过Java类和数据库表之间的映射(Mapping),实现了对象的持久化。在源码中,`hibernate.cfg.xml`配置文件定义了...
总的来说,Hibernate的启动过程涉及多个核心类和接口的协作,从配置文件的读取解析到`SessionFactory`的创建,每一步都至关重要,深刻理解这一流程对于掌握Hibernate框架的应用和优化具有重要意义。
配置完成后,可以使用`buildSessionFactory`方法创建SessionFactory,它是线程安全的,一个应用程序通常只需要一个SessionFactory实例。 接下来,实体类是Hibernate工作的基础。实体类通常对应数据库中的表,类中的...
【标题】"Hibernate源码"涉及的是Java领域中著名的对象关系映射(ORM)框架Hibernate的核心源代码。ORM框架允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句,极大地提高了开发效率和代码可读性。...
Hibernate 的配置可以通过多种方式实现,包括配置文件、可编程配置和 JNDI绑定。配置文件可以是 XML 文件或 properties 文件,用于指定数据库连接信息、映射文件路径等信息。可编程配置可以在运行时动态生成配置信息...
2. **org.hibernate.cfg**: 配置相关的类,如Configuration,用于加载Hibernate配置文件,建立SessionFactory。Environment类中定义了一些常量,比如连接数据库所需的属性。 3. **org.hibernate.cache**: 缓存管理...
在Hibernate源码的学习过程中,我们可以深入理解ORM的工作原理,提高我们的Java开发技能,并且能够更好地优化数据库操作。 一、Hibernate核心组件 1. Configuration:配置对象,负责读取hibernate.cfg.xml文件,...