﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-wiflish-随笔分类-hibernate</title><link>http://www.blogjava.net/wiflish/category/11471.html</link><description>Loving Life! Loving Coding!</description><language>zh-cn</language><lastBuildDate>Thu, 12 Apr 2007 22:11:29 GMT</lastBuildDate><pubDate>Thu, 12 Apr 2007 22:11:29 GMT</pubDate><ttl>60</ttl><item><title>Hibernate3的配置参数汇总.</title><link>http://www.blogjava.net/wiflish/archive/2007/04/12/110152.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Thu, 12 Apr 2007 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2007/04/12/110152.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/110152.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2007/04/12/110152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/110152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/110152.html</trackback:ping><description><![CDATA[
		<h3 class="title">SQL方言</h3>
		<b>1、Hibernate JDBC属性</b>
		<br />
		<br />
		<table summary="                Hibernate JDBC属性&#xD;&#xA;            " border="1">
				<thead>
						<tr>
								<th>
                            属性名
                        </th>
								<th>
                            用途
                        </th>
						</tr>
				</thead>
				<tbody>
						<tr>
								<td>
										<tt class="literal">hibernate.connection.driver_class</tt>
								</td>
								<td>
										<i>
												<span class="emphasis">
														<em>jdbc驱动类</em>
												</span>
										</i>
								</td>
						</tr>
						<tr>
								<td>
										<tt class="literal">hibernate.connection.url</tt>
								</td>
								<td>
										<span class="emphasis">
												<em>jdbc URL</em>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<tt class="literal">hibernate.connection.username</tt>
								</td>
								<td>
										<span class="emphasis">
												<em>数据库用户</em>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<tt class="literal">hibernate.connection.password</tt>
								</td>
								<td>
										<span class="emphasis">
												<em>数据库用户密码</em>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<tt class="literal">hibernate.connection.pool_size</tt>
								</td>
								<td>
										<span class="emphasis">
												<em>连接池容量上限数目</em>
										</span>
								</td>
						</tr>
				</tbody>
		</table>注：使用C3P0的properties样例代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">hibernate.connection.driver_class = org.postgresql.Driver<br />hibernate.connection.url = jdbc:postgresql://localhost/mydatabase<br />hibernate.connection.username = myuser<br />hibernate.connection.password = secret<br />hibernate.c3p0.min_size=5<br />hibernate.c3p0.max_size=20<br />hibernate.c3p0.timeout=1800<br />hibernate.c3p0.max_statements=50<br />hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect</span></div><br /><b>2、Hibernate的数据源属性</b><br /><table summary="                Hibernate数据源属性&#xD;&#xA;            " border="1" height="182" width="544"><thead><tr><th>
                            属性名
                        </th><th>
                            用途
                        </th></tr></thead><tbody><tr><td><tt class="literal">hibernate.connection.datasource</tt></td><td><span class="emphasis"><em>数据源JNDI名字</em></span></td></tr><tr><td><tt class="literal">hibernate.jndi.url</tt></td><td><span class="emphasis"><em>JNDI提供者的URL</em></span> (可选)
                </td></tr><tr><td><tt class="literal">hibernate.jndi.class</tt></td><td><span class="emphasis"><em>JNDI <tt class="literal">InitialContextFactory</tt>类</em></span> (可选)
                </td></tr><tr><td><tt class="literal">hibernate.connection.username</tt></td><td><span class="emphasis"><em>数据库用户</em></span> (可选)
                </td></tr><tr><td><tt class="literal">hibernate.connection.password</tt></td><td><span class="emphasis"><em>数据库用户密码</em></span> (可选)</td></tr></tbody></table>注：应用程序服务器JNDI数据源的<tt class="literal">hibernate.properties</tt>样例代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">hibernate.connection.datasource = java:/comp/env/jdbc/test<br />hibernate.transaction.factory_class = \<br />    org.hibernate.transaction.JTATransactionFactory<br />hibernate.transaction.manager_lookup_class = \<br />    org.hibernate.transaction.JBossTransactionManagerLookup<br />hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect</span></div><br />3、<b>Hibernate配置属性（可选）</b><br /><table summary="                Hibernate配置属性&#xD;&#xA;            " border="1" height="870" width="745"><thead><tr><th>
                            属性名
                        </th><th>
                            用途
                        </th></tr></thead><tbody><tr><td><tt class="literal">hibernate.dialect</tt></td><td>
                            一个Hibernate <tt class="literal">Dialect</tt>类名允许Hibernate针对特定的关系数据库生成优化的SQL.
                            <p><span class="strong">取值</span><tt class="literal">full.classname.of.Dialect</tt></p></td></tr><tr><td><tt class="literal">hibernate.show_sql</tt></td><td>
                            输出所有SQL语句到控制台.
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.format_sql</tt></td><td>
                            在log和console中打印出更漂亮的sql.
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.default_schema</tt></td><td>
                            在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上.
                            <p><span class="strong">取值</span><tt class="literal">SCHEMA_NAME</tt></p></td></tr><tr><td><tt class="literal">hibernate.default_catalog</tt></td><td>
                            在生成的SQL中, 将给定的catalog附加于没全限定名的表名上.
                            <p><span class="strong">取值</span><tt class="literal">CATALOG_NAME</tt></p></td></tr><tr><td><tt class="literal">hibernate.session_factory_name</tt></td><td><tt class="literal">SessionFactory</tt>创建后，将自动使用这个名字绑定到JNDI中.
                            <p><span class="strong">取值</span><tt class="literal">jndi/composite/name</tt></p></td></tr><tr><td><tt class="literal">hibernate.max_fetch_depth</tt></td><td>
                            为单向关联(一对一, 多对一)的外连接抓取（outer join fetch）树设置最大深度.
                            值为<tt class="literal">0</tt>意味着将关闭默认的外连接抓取.
                            <p><span class="strong">取值</span> 
                                建议在<tt class="literal">0</tt>到<tt class="literal">3</tt>之间取值
                            </p></td></tr><tr><td><tt class="literal">hibernate.default_batch_fetch_size</tt></td><td>
                            为Hibernate关联的批量抓取设置默认数量.
                            <p><span class="strong">取值</span> 
                                建议的取值为<tt class="literal">4</tt>, <tt class="literal">8</tt>, 
                                和<tt class="literal">16</tt></p></td></tr><tr><td><tt class="literal">hibernate.default_entity_mode</tt></td><td>
                            为由这个<tt class="literal">SessionFactory</tt>打开的所有Session指定默认的实体表现模式.
                            <p><span class="strong">取值</span><tt class="literal">dynamic-map</tt>, <tt class="literal">dom4j</tt>,
                                <tt class="literal">pojo</tt></p></td></tr><tr><td><tt class="literal">hibernate.order_updates</tt></td><td>
                            强制Hibernate按照被更新数据的主键，为SQL更新排序。这么做将减少在高并发系统中事务的死锁。
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.generate_statistics</tt></td><td>
                            如果开启, Hibernate将收集有助于性能调节的统计数据.
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.use_identifer_rollback</tt></td><td>
                            如果开启, 在对象被删除时生成的标识属性将被重设为默认值.
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.use_sql_comments</tt></td><td>
                            如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为<tt class="literal">false</tt>.
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr></tbody></table><br />4、<b>Hibernate JDBC和连接(connection)属性<br /></b><table summary="                Hibernate JDBC和连接(connection)属性&#xD;&#xA;            " border="1"><thead><tr><th>
                            属性名
                        </th><th>
                            用途
                        </th></tr></thead><tbody><tr><td><tt class="literal">hibernate.jdbc.fetch_size</tt></td><td>
                            非零值，指定JDBC抓取数量的大小 (调用<tt class="literal">Statement.setFetchSize()</tt>).
                        </td></tr><tr><td><tt class="literal">hibernate.jdbc.batch_size</tt></td><td>
                            非零值，允许Hibernate使用JDBC2的批量更新.
                            <p><span class="strong">取值</span>
                                建议取<tt class="literal">5</tt>到<tt class="literal">30</tt>之间的值
                            </p></td></tr><tr><td><tt class="literal">hibernate.jdbc.batch_versioned_data</tt></td><td>
                            如果你想让你的JDBC驱动从<tt class="literal">executeBatch()</tt>返回正确的行计数 , 
                            那么将此属性设为<tt class="literal">true</tt>(开启这个选项通常是安全的). 
                            同时，Hibernate将为自动版本化的数据使用批量DML. 默认值为<tt class="literal">false</tt>.
                            <p><span class="strong">eg.</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.jdbc.factory_class</tt></td><td>
                            选择一个自定义的<tt class="literal">Batcher</tt>. 多数应用程序不需要这个配置属性.
                            <p><span class="strong">eg.</span><tt class="literal">classname.of.Batcher</tt></p></td></tr><tr><td><tt class="literal">hibernate.jdbc.use_scrollable_resultset</tt></td><td>
                            允许Hibernate使用JDBC2的可滚动结果集.
                            只有在使用用户提供的JDBC连接时，这个选项才是必要的, 
                            否则Hibernate会使用连接的元数据.
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.jdbc.use_streams_for_binary</tt></td><td>
                            在JDBC读写<tt class="literal">binary (二进制)</tt>或<tt class="literal">serializable (可序列化)</tt>
                            的类型时使用流(stream)(系统级属性).
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.jdbc.use_get_generated_keys</tt></td><td>
                            在数据插入数据库之后，允许使用JDBC3 <tt class="literal">PreparedStatement.getGeneratedKeys()</tt>
                            来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标
                            识生成器时遇到问题，请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力.
                            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p></td></tr><tr><td><tt class="literal">hibernate.connection.provider_class</tt></td><td>
                            自定义<tt class="literal">ConnectionProvider</tt>的类名, 此类用来向Hibernate提供JDBC连接.
                            <p><span class="strong">取值</span><tt class="literal">classname.of.ConnectionProvider</tt></p></td></tr><tr><td><tt class="literal">hibernate.connection.isolation</tt></td><td>
                        设置JDBC事务隔离级别. 查看<tt class="literal">java.sql.Connection</tt>来了解各个值的具体意义, 
                        但请注意多数数据库都不支持所有的隔离级别.
                        <p><span class="strong">取值</span><tt class="literal">1, 2, 4, 8</tt></p></td></tr><tr><td><tt class="literal">hibernate.connection.autocommit</tt></td><td>
                            允许被缓存的JDBC连接开启自动提交(autocommit) (不建议).
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.connection.release_mode</tt></td><td>
                            指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 
                            对于应用程序服务器的JTA数据源, 你应当使用<tt class="literal">after_statement</tt>, 这样在每次JDBC调用后，都会主动的释放连接. 
                            对于非JTA的连接, 使用<tt class="literal">after_transaction</tt>在每个事务结束时释放连接是合理的. 
                            <tt class="literal">auto</tt>将为JTA和CMT事务策略选择<tt class="literal">after_statement</tt>, 
                            为JDBC事务策略选择<tt class="literal">after_transaction</tt>.
                            <p><span class="strong">取值</span><tt class="literal">on_close</tt> | <tt class="literal">after_transaction</tt> |
                                <tt class="literal">after_statement</tt> | <tt class="literal">auto</tt></p></td></tr><tr><td><tt class="literal">hibernate.connection.<span class="emphasis"><em>&lt;propertyName&gt;</em></span></tt></td><td>
                            将JDBC属性<tt class="literal">propertyName</tt>传递到<tt class="literal">DriverManager.getConnection()</tt>中去.
                        </td></tr><tr><td><tt class="literal">hibernate.jndi.<span class="emphasis"><em>&lt;propertyName&gt;</em></span></tt></td><td>
                            将属性<tt class="literal">propertyName</tt>传递到JNDI <tt class="literal">InitialContextFactory</tt>中去.</td></tr></tbody></table><br /><b>5、Hibernate缓存属性<br /></b><table summary="                Hibernate缓存属性&#xD;&#xA;            " border="1"><thead><tr><th>
                            属性名
                        </th><th>
                            用途
                        </th></tr></thead><tbody><tr><td><tt class="literal">hibernate.cache.provider_class</tt></td><td>
                            自定义的<tt class="literal">CacheProvider</tt>的类名.
                            <p><span class="strong">取值</span><tt class="literal">classname.of.CacheProvider</tt></p></td></tr><tr><td><tt class="literal">hibernate.cache.use_minimal_puts</tt></td><td>
                            以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中，这个设置对的集群缓存非常有用, 
                            对集群缓存的实现而言，默认是开启的.
                            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p></td></tr><tr><td><tt class="literal">hibernate.cache.use_query_cache</tt></td><td>
                            允许查询缓存, 个别查询仍然需要被设置为可缓存的.
                            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p></td></tr><tr><td><tt class="literal">hibernate.cache.use_second_level_cache</tt></td><td>
                            能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<tt class="literal">&lt;cache&gt;</tt>的类，会默认开启二级缓存.
                            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p></td></tr><tr><td><tt class="literal">hibernate.cache.query_cache_factory</tt></td><td>
                            自定义的实现<tt class="literal">QueryCache</tt>接口的类名,
                            默认为内建的<tt class="literal">StandardQueryCache</tt>.
                            <p><span class="strong">取值</span><tt class="literal">classname.of.QueryCache</tt></p></td></tr><tr><td><tt class="literal">hibernate.cache.region_prefix</tt></td><td>
                            二级缓存区域名的前缀.
                            <p><span class="strong">取值</span><tt class="literal">prefix</tt></p></td></tr><tr><td><tt class="literal">hibernate.cache.use_structured_entries</tt></td><td>
                            强制Hibernate以更人性化的格式将数据存入二级缓存.
                            <p><span class="strong">取值</span><tt class="literal">true|false</tt></p></td></tr></tbody></table><br />6、<b>Hibernate事务属性<br /></b><table summary="                Hibernate事务属性&#xD;&#xA;            " border="1"><thead><tr><th>
                            属性名
                        </th><th>
                            用途
                        </th></tr></thead><tbody><tr><td><tt class="literal">hibernate.transaction.factory_class</tt></td><td>
                            一个<tt class="literal">TransactionFactory</tt>的类名, 用于Hibernate <tt class="literal">Transaction</tt> API
                            (默认为<tt class="literal">JDBCTransactionFactory</tt>).
                            <p><span class="strong">取值</span><tt class="literal">classname.of.TransactionFactory</tt></p></td></tr><tr><td><tt class="literal">jta.UserTransaction</tt></td><td>
                            一个JNDI名字，被<tt class="literal">JTATransactionFactory</tt>用来从应用服务器获取JTA <tt class="literal">UserTransaction</tt>.
                            <p><span class="strong">取值</span><tt class="literal">jndi/composite/name</tt></p></td></tr><tr><td><tt class="literal">hibernate.transaction.manager_lookup_class</tt></td><td>
                            一个<tt class="literal">TransactionManagerLookup</tt>的类名
                            - 当使用JVM级缓存，或在JTA环境中使用hilo生成器的时候需要该类.
                            <p><span class="strong">取值</span><tt class="literal">classname.of.TransactionManagerLookup</tt></p></td></tr><tr><td><tt class="literal">hibernate.transaction.flush_before_completion</tt></td><td>
                            如果开启, session在事务完成后将被自动清洗(flush). (在Hibernate和CMT一起使用时很有用.)
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr><tr><td><tt class="literal">hibernate.transaction.auto_close_session</tt></td><td>
                            如果开启, session在事务完成前将被自动关闭. (在Hibernate和CMT一起使用时很有用.)
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr></tbody></table><br />7、<b>其他属性<br /></b><table summary="                其他属性&#xD;&#xA;            " border="1"><thead><tr><th>
                            属性名
                            </th><th>
                            用途
                        </th></tr></thead><tbody><tr><td><tt class="literal">hibernate.query.factory_class</tt></td><td>
                            选择HQL解析器的实现.
                            <p><span class="strong">取值</span><tt class="literal">org.hibernate.hql.ast.ASTQueryTranslatorFactory</tt> or
                                <tt class="literal">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</tt></p></td></tr><tr><td><tt class="literal">hibernate.query.substitutions</tt></td><td>
                            将Hibernate查询中的符号映射到SQL查询中的符号
                            (符号可能是函数名或常量名字).
                            <p><span class="strong">取值</span><tt class="literal">hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</tt></p></td></tr><tr><td><tt class="literal">hibernate.hbm2ddl.auto</tt></td><td>
                            在<tt class="literal">SessionFactory</tt>创建时，自动将数据库schema的DDL导出到数据库. 使用
                            <tt class="literal">create-drop</tt>时,在显式关闭<tt class="literal">SessionFactory</tt>时，将drop掉数据库schema.
                            <p><span class="strong">取值</span><tt class="literal">update</tt> | <tt class="literal">create</tt> | <tt class="literal">create-drop</tt></p></td></tr><tr><td><tt class="literal">hibernate.cglib.use_reflection_optimizer</tt></td><td>
                            开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 
                            注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在<tt class="literal">hibernate.cfg.xml</tt>中设置此属性.
                            <p><span class="strong">取值</span><tt class="literal">true</tt> | <tt class="literal">false</tt></p></td></tr></tbody></table><br />8、<b>SQL方言<br /></b><b>   Hibernate SQL方言 (<tt class="literal">hibernate.dialect</tt>)
                </b><table summary="                    Hibernate SQL方言 (hibernate.dialect)&#xD;&#xA;                " border="1" height="614" width="520"><colgroup><col /><col /></colgroup><thead><tr><th>RDBMS</th><th>
                                方言
                            </th></tr></thead><tbody><tr><td>DB2</td><td><tt class="literal">org.hibernate.dialect.DB2Dialect</tt></td></tr><tr><td>DB2 AS/400</td><td><tt class="literal">org.hibernate.dialect.DB2400Dialect</tt></td></tr><tr><td>DB2 OS390</td><td><tt class="literal">org.hibernate.dialect.DB2390Dialect</tt></td></tr><tr><td>PostgreSQL</td><td><tt class="literal">org.hibernate.dialect.PostgreSQLDialect</tt></td></tr><tr><td>MySQL</td><td><tt class="literal">org.hibernate.dialect.MySQLDialect</tt></td></tr><tr><td>MySQL with InnoDB</td><td><tt class="literal">org.hibernate.dialect.MySQLInnoDBDialect</tt></td></tr><tr><td>MySQL with MyISAM</td><td><tt class="literal">org.hibernate.dialect.MySQLMyISAMDialect</tt></td></tr><tr><td>Oracle (any version)</td><td><tt class="literal">org.hibernate.dialect.OracleDialect</tt></td></tr><tr><td>Oracle 9i/10g</td><td><tt class="literal">org.hibernate.dialect.Oracle9Dialect</tt></td></tr><tr><td>Sybase</td><td><tt class="literal">org.hibernate.dialect.SybaseDialect</tt></td></tr><tr><td>Sybase Anywhere</td><td><tt class="literal">org.hibernate.dialect.SybaseAnywhereDialect</tt></td></tr><tr><td>Microsoft SQL Server</td><td><tt class="literal">org.hibernate.dialect.SQLServerDialect</tt></td></tr><tr><td>SAP DB</td><td><tt class="literal">org.hibernate.dialect.SAPDBDialect</tt></td></tr><tr><td>Informix</td><td><tt class="literal">org.hibernate.dialect.InformixDialect</tt></td></tr><tr><td>HypersonicSQL</td><td><tt class="literal">org.hibernate.dialect.HSQLDialect</tt></td></tr><tr><td>Ingres</td><td><tt class="literal">org.hibernate.dialect.IngresDialect</tt></td></tr><tr><td>Progress</td><td><tt class="literal">org.hibernate.dialect.ProgressDialect</tt></td></tr><tr><td>Mckoi SQL</td><td><tt class="literal">org.hibernate.dialect.MckoiDialect</tt></td></tr><tr><td>Interbase</td><td><tt class="literal">org.hibernate.dialect.InterbaseDialect</tt></td></tr><tr><td>Pointbase</td><td><tt class="literal">org.hibernate.dialect.PointbaseDialect</tt></td></tr><tr><td>FrontBase</td><td><tt class="literal">org.hibernate.dialect.FrontbaseDialect</tt></td></tr><tr><td>Firebird</td><td><tt class="literal">org.hibernate.dialect.FirebirdDialect</tt></td></tr></tbody></table><br />9、<b>Hibernate日志类别<br /></b><table summary="                    Hibernate日志类别&#xD;&#xA;                " border="1" height="315" width="745"><thead><tr><th>
                                类别
                            </th><th>
                                功能
                            </th></tr></thead><tbody><tr><td><tt class="literal">org.hibernate.SQL</tt></td><td>
                                在所有SQL DML语句被执行时为它们记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.type</tt></td><td>
                                为所有JDBC参数记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.tool.hbm2ddl</tt></td><td>
                                在所有SQL DDL语句执行时为它们记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.pretty</tt></td><td>
                                在session清洗(flush)时，为所有与其关联的实体(最多20个)的状态记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.cache</tt></td><td>
                                为所有二级缓存的活动记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.transaction</tt></td><td>
                                为事务相关的活动记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.jdbc</tt></td><td>
                                为所有JDBC资源的获取记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.hql.ast</tt></td><td>
                                为HQL和SQL的自动状态转换和其他关于查询解析的信息记录日志
                            </td></tr><tr><td><tt class="literal">org.hibernate.secure</tt></td><td>
                                为JAAS认证请求做日志
                            </td></tr><tr><td><tt class="literal">org.hibernate</tt></td><td>
                                为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助)</td></tr></tbody></table><br /><br /><img src ="http://www.blogjava.net/wiflish/aggbug/110152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2007-04-12 13:28 <a href="http://www.blogjava.net/wiflish/archive/2007/04/12/110152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate回调与拦截机制——Hibernate深入浅出</title><link>http://www.blogjava.net/wiflish/archive/2006/08/16/63966.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Wed, 16 Aug 2006 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/08/16/63966.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/63966.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/08/16/63966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/63966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/63966.html</trackback:ping><description><![CDATA[Hibernate的回调与拦截机制有三种实现方法：<br />1、实体对象implements Lifecycle接口，Lifecycle接口代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> Lifecycle {<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * 在实体对象Save/Insert操作之前触发.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> onSave(Session s) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    <br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * 在Session.update()操作之前触发.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> onUpdate(Session s) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * 在实体对象删除之前触发.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> onDelete(Session s) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><br /><span style="color: rgb(0, 128, 0);">     * 在实体对象加载之后触发.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> onLoad(Session s, Serializable id);<br />}</span></div>实体对象通过实现Lifecycle接口，即可以在特定的持久化阶段，触发特定的处理过程。比如在实体对象Tuser实现了Lifecycle接口的onSave方法，则在实体对象Tuser保存之前将先执行onSave方法。<br /><br />2、实体对象implements Validatable接口，Validatable接口代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> Validatable {<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> validate() </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> ValidationFailure;<br />}</span></div>   Validatable接口定义了数据验证实现方式。实体对象实现Validatable接口，并在validate方法中对当前<b>待保存</b>的数据进行验证，以保证数据的逻辑合法性(由于该方法在实体对象生命周期内，可能被多次调用，所以此方法最好只用于数据本身的逻辑合法性验证，而不要试图去实现数据业务逻辑的验证)。<br /><br />以上2种方法都要求实现Hibernate中的Lifecycle或Validatable接口，具有很大的侵入性，使得实体对象的移植很不方便。Hibernate又提供了一种拦截机制，为对象持久化事件的捕获和处理提供了一个非侵入性的实现。<br /><br />3、实现Interceptor接口，在创建session时，指定加载Interceptor相应的实现类，此session 的持久化操作都将首先经由此拦截器捕获处理。Interceptor(Hibernate3)接口代码：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> org.hibernate;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.io.Serializable;<br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.Iterator;<br /><br /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.hibernate.type.Type;<br /><br /></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> Interceptor {<br /> <br />    </span><span style="color: rgb(0, 128, 0);">//对象初始化之前加载,这里的entity处于刚被创建的状态(即属性均未赋值).</span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, <br />            Type[] types) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br />    //Session.flush()方法进行脏数据检查时,如果发现PO状态改变,则调用此方法(即实体对象更新之前调用).<br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> onFlushDirty(Object entity, Serializable id, Object[] currentState, <br />           Object[] previousState, String[] propertyNames, Type[] types) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    <br /></span><span style="color: rgb(0, 128, 0);">    //在实体对象被保存之前调用.</span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);"> onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, <br />           Type[] types) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br />    //在对象被删除之前调用.<br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, <br />           Type[] types) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called before a collection is (re)created.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> onCollectionRecreate(Object collection, Serializable key) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called before a collection is deleted.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> onCollectionRemove(Object collection, Serializable key) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called before a collection is updated.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> onCollectionUpdate(Object collection, Serializable key) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br />    //Session执行flush方法之前调用.<br /></span><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> preFlush(Iterator entities) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />   </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 0);">    //Session执行flush方法之后调用.</span><br /><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> postFlush(Iterator entities) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called to distinguish between transient and detached entities. The return value determines the<br />     * state of the entity with respect to the current session.<br />     * &lt;ul&gt;<br />     * &lt;li&gt;&lt;tt&gt;Boolean.TRUE&lt;/tt&gt; - the entity is transient<br />     * &lt;li&gt;&lt;tt&gt;Boolean.FALSE&lt;/tt&gt; - the entity is detached<br />     * &lt;li&gt;&lt;tt&gt;null&lt;/tt&gt; - Hibernate uses the &lt;tt&gt;unsaved-value&lt;/tt&gt; mapping and other heuristics to <br />     * determine if the object is unsaved<br />     * &lt;/ul&gt;<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> entity a transient or detached entity<br />     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> Boolean or &lt;tt&gt;null&lt;/tt&gt; to choose default behaviour<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Boolean isTransient(Object entity);<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called from &lt;tt&gt;flush()&lt;/tt&gt;. The return value determines whether the entity is updated<br />     * &lt;ul&gt;<br />     * &lt;li&gt;an array of property indices - the entity is dirty<br />     * &lt;li&gt;an empty array - the entity is not dirty<br />     * &lt;li&gt;&lt;tt&gt;null&lt;/tt&gt; - use Hibernate's default dirty-checking algorithm<br />     * &lt;/ul&gt;<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> entity a persistent entity<br />     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> array of dirty property indices or &lt;tt&gt;null&lt;/tt&gt; to choose default behaviour<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">[] findDirty(Object entity, Serializable id, Object[] currentState, <br />             Object[] previousState, String[] propertyNames, Type[] types);<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Instantiate the entity class. Return &lt;tt&gt;null&lt;/tt&gt; to indicate that Hibernate should use<br />     * the default constructor of the class. The identifier property of the returned instance<br />     * should be initialized with the given identifier.<br />     *<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> entityName the name of the entity<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> entityMode The type of entity instance to be returned.<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> id the identifier of the new instance<br />     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> an instance of the class, or &lt;tt&gt;null&lt;/tt&gt; to choose default behaviour<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Object instantiate(String entityName, EntityMode entityMode, <br />           Serializable id) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Get the entity name for a persistent or transient instance<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> object an entity instance<br />     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> the name of the entity<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> String getEntityName(Object object) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Get a fully loaded entity instance that is cached externally<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> entityName the name of the entity<br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> id the instance identifier<br />     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> a fully initialized entity<br />     * </span><span style="color: rgb(128, 128, 128);">@throws</span><span style="color: rgb(0, 128, 0);"> CallbackException<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> Object getEntity(String entityName, Serializable id) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> CallbackException;<br />    <br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called when a Hibernate transaction is begun via the Hibernate &lt;tt&gt;Transaction&lt;/tt&gt; <br />     * API. Will not be called if transactions are being controlled via some other <br />     * mechanism (CMT, for example).<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> afterTransactionBegin(Transaction tx);<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called before a transaction is committed (but not before rollback).<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> beforeTransactionCompletion(Transaction tx);<br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);">     * Called after a transaction is committed or rolled back.<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> afterTransactionCompletion(Transaction tx);<br /><br />    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />     * Called when sql string is being prepared. <br />     * </span><span style="color: rgb(128, 128, 128);">@param</span><span style="color: rgb(0, 128, 0);"> sql sql to be prepared<br />     * </span><span style="color: rgb(128, 128, 128);">@return</span><span style="color: rgb(0, 128, 0);"> original or modified sql<br />     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> String onPrepareStatement(String sql);<br />}<br /></span></div><br /><br /><br /><br /><img src ="http://www.blogjava.net/wiflish/aggbug/63966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-08-16 17:41 <a href="http://www.blogjava.net/wiflish/archive/2006/08/16/63966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3 实体属性的延迟加载——Hibernate深入浅出</title><link>http://www.blogjava.net/wiflish/archive/2006/08/15/63692.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Tue, 15 Aug 2006 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/08/15/63692.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/63692.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/08/15/63692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/63692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/63692.html</trackback:ping><description><![CDATA[如果实体对象中存在大文本或者图像等属性字段，有必要将该种字段设置为延迟加载，即在需使用该字段的时候再加载该字段的内容。<br />属性延迟加载的实现：<br />1、在实体映射文件中，通过property节点的lazy属性，可以为特定的属性制定延迟加载策略。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class <br />     </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="test.Tuser"</span><span style="color: rgb(255, 0, 0);"><br />     table</span><span style="color: rgb(0, 0, 255);">="T_USER"</span><span style="color: rgb(255, 0, 0);"><br />     batch-size</span><span style="color: rgb(0, 0, 255);">="5"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);"> columen</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">generator </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="native"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property <br />         </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="name"</span><span style="color: rgb(255, 0, 0);"><br />         column</span><span style="color: rgb(0, 0, 255);">="name"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property <br />         </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="age"</span><span style="color: rgb(255, 0, 0);"><br />         column</span><span style="color: rgb(0, 0, 255);">="age"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property<br />         </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="resume"</span><span style="color: rgb(255, 0, 0);"><br />         column</span><span style="color: rgb(0, 0, 255);">="resume"</span><span style="color: rgb(255, 0, 0);"><br />         lazy</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(0, 0, 255);">/&gt;                //这里将个人简历（大文本字段）设置为延迟加载。</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br />2、配置了lazy属性之外，还要借助类增强器对二进制Class文件进行强化处理（buildtime bytecode instrumentation)。通过ANT调用Hibernate类增强器对TUser.class文件进行强化处理。脚本如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">project </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="HibernateSample"</span><span style="color: rgb(255, 0, 0);"> default</span><span style="color: rgb(0, 0, 255);">="instrument"</span><span style="color: rgb(255, 0, 0);"> basedir</span><span style="color: rgb(0, 0, 255);">="."</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="lib.dir"</span><span style="color: rgb(255, 0, 0);"> value</span><span style="color: rgb(0, 0, 255);">="./lib"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="classes.dir"</span><span style="color: rgb(255, 0, 0);"> value</span><span style="color: rgb(0, 0, 255);">="./bin"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  <br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">path </span><span style="color: rgb(255, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">="lib.class.path"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">fileset </span><span style="color: rgb(255, 0, 0);">dir</span><span style="color: rgb(0, 0, 255);">="${lib.dir}"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />         </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">include </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="**/*.jar"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">fileset</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   <br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">target </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="instrument"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">taskdef </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="instrument"</span><span style="color: rgb(255, 0, 0);"><br />         classname</span><span style="color: rgb(0, 0, 255);">="org.hibernate.tool.instrument.InstrumentTask"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">classpath </span><span style="color: rgb(255, 0, 0);">path</span><span style="color: rgb(0, 0, 255);">="${classes.dir}"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">classpath </span><span style="color: rgb(255, 0, 0);">refid</span><span style="color: rgb(0, 0, 255);">="lib.class.path"</span><span style="color: rgb(0, 0, 255);">/&gt;<br />     &lt;/</span><span style="color: rgb(0, 0, 255);"></span><span style="color: rgb(128, 0, 0);">taskdef</span><span style="color: rgb(0, 0, 255);">&gt;<br /></span><span style="color: rgb(0, 0, 0);">        <br />     </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">instrument </span><span style="color: rgb(255, 0, 0);">verbose</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">fileset </span><span style="color: rgb(255, 0, 0);">dir</span><span style="color: rgb(0, 0, 255);">="${classes.dir}/com.redsaga/hibernate/db/entity"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />           </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">include </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="TUser.class"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">fileset</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">instrument</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">target</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">project</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span></div>注：脚本中涉及的配置路径，根据项目目录修改。<br /><img src ="http://www.blogjava.net/wiflish/aggbug/63692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-08-15 15:54 <a href="http://www.blogjava.net/wiflish/archive/2006/08/15/63692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate数据加载方式——hibernate深入浅出</title><link>http://www.blogjava.net/wiflish/archive/2006/08/03/61544.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Thu, 03 Aug 2006 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/08/03/61544.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/61544.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/08/03/61544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/61544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/61544.html</trackback:ping><description><![CDATA[Hibernate数据加载方式：<br />1、即时加载（Immediate Loading）<br />   当实体加载完成后，立即加载与实体相关联的数据。即当实体加载完成后，Hibernate自动立即读取与实体相关联的数据，并且填充到实体对应的属性中。这种加载通常有多条select语句，即select实体数据后，同时select实体相关联的数据。<br /><br />2、延迟加载（Lazy Loading）<br />   实体加载时，其关联数据并不是立即读取，而是当关联数据第一次被访问时再进行读取，这种加载方式在第一次访问关联数据时，必须在同一个session中，否则会报session已关闭错误。<br />   延迟加载通过在实体的hbm文件中的对应属性中设定lazy="true"实现。Hibernate3默认的加载方式是延迟加载。即默认lazy="true"，主要用于one-to-many场合。<br /><br />3、预先加载（Eager Loading）<br />   预先加载时，实体及关联对象同时读取，与即时加载类似，但是预先加载是使用"outer-join"通过一条select语句同时读取。<br />   注意：当实体间关联比较复杂时，比如多层关联，Hibernate生成的"outer join SQL"可能过于复杂，此时可以通过设定全局变量（hibernate.max_fetch_depth）限定join的层次（一般设定为5层）。<br /><br />4、批量加载（Batch Loading）<br />   对于即时和延迟加载，可以采用批量加载进行优化。<br />   批量加载就是通过批量提交多个限定条件，一次多个限定条件的数据读取。同时在实体映射文件中的class节点，通过配置"batch-size"参数打开批量加载机制，并限定每次批量加载数据的数量,一般来说该值&lt;10较合理.<br />  <br />比如：   <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">select </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> from test where id</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br />select </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> from test where id</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;</span></div>   我们可以整合成一条语句：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">select </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> from test where id</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"> ro id</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;</span></div>  这就是所谓的批量加载机制。<br /><br /><br /><img src ="http://www.blogjava.net/wiflish/aggbug/61544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-08-03 17:25 <a href="http://www.blogjava.net/wiflish/archive/2006/08/03/61544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Hibernate: could not initialize proxy - the owning Session was closed</title><link>http://www.blogjava.net/wiflish/archive/2006/07/27/60362.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Thu, 27 Jul 2006 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/07/27/60362.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/60362.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/07/27/60362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/60362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/60362.html</trackback:ping><description><![CDATA[原文链接: <a href="http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_essay_16.htm">http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_essay_16.htm</a><br />本错误的产生原因及解释:<br /> <br /><font size="4">延迟初始化错误（ERROR LazyInitializer）是如何产生的?</font><br /><br /><font size="2">选自&lt;&lt;精通Hibernate：Java对象持久化技术详解&gt;&gt; 作者：<a href="http://www.javathinker.org/main.jsp?bc=weiqin/weiqin.jsp">孙卫琴</a> 
              来源:www.javathinker.org<br />
              如果转载，请标明出处，谢谢</font><br /><br /><p> 延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略，那么必须当代理类实例或代理集合处于持久化状态（即处于Session范围内）时，才能初始化它。如果在游离状态时才初始化它，就会产生延迟初始化错误。</p><p>下面把Customer.hbm.xml文件的&lt;class&gt;元素的lazy属性设为true，表示使用延迟检索策略：</p><p>&lt;class name="mypack.Customer" table="CUSTOMERS" 
              lazy="true"&gt;</p><p>当执行Session的load()方法时，Hibernate不会立即执行查询CUSTOMERS表的select语句，仅仅返回Customer类的代理类的实例，这个代理类具由以下特征：</p><p>（1） 由Hibernate在运行时动态生成，它扩展了Customer类，因此它继承了Customer类的所有属性和方法，但它的实现对于应用程序是透明的。<br />
              （2） 当Hibernate创建Customer代理类实例时，仅仅初始化了它的OID属性，其他属性都为null，因此这个代理类实例占用的内存很少。<br />
（3）
当应用程序第一次访问Customer代理类实例时（例如调用customer.getXXX()或customer.setXXX()方法），
Hibernate会初始化代理类实例，在初始化过程中执行select语句，真正从数据库中加载Customer对象的所有数据。但有个例外，那就是当
应用程序访问Customer代理类实例的getId()方法时，Hibernate不会初始化代理类实例，因为在创建代理类实例时OID就存在了，不必
到数据库中去查询。<br /><br /><i>提
示：Hibernate采用CGLIB工具来生成持久化类的代理类。CGLIB是一个功能强大的Java字节码生成工具，它能够在程序运行时动态生成扩展
Java类或者实现Java接口的代理类。关于CGLIB的更多知识，请参考：http://cglib.sourceforge.net/。</i></p><p>以下代码先通过Session的load()方法加载Customer对象，然后访问它的name属性： </p><p>tx = session.beginTransaction();<br />
              Customer customer=(Customer)session.load(Customer.class,new Long(1));<br />
              customer.getName();<br />
              tx.commit();</p><p>在
运行session.load()方法时Hibernate不执行任何select语句，仅仅返回Customer类的代理类的实例，它的OID为1，这
是由load()方法的第二个参数指定的。当应用程序调用customer.getName()方法时，Hibernate会初始化Customer代理
类实例，从数据库中加载Customer对象的数据，执行以下select语句：</p><p>select * from CUSTOMERS where ID=1;<br />
              select * from ORDERS where CUSTOMER_ID=1;</p><p>当&lt;class&gt;元素的lazy属性为true，会影响Session的load()方法的各种运行时行为，下面举例说明。</p><p>1．如果加载的Customer对象在数据库中不存在，Session的load()方法不会抛出异常，只有当运行customer.getName()方法时才会抛出以下异常：</p><p>ERROR LazyInitializer:63 - Exception initializing proxy<br />
              net.sf.hibernate.ObjectNotFoundException: No row with the given 
              identifier exists: 1, of class: <br />
              mypack.Customer</p><p>2．如果在整个Session范围内，应用程序没有访问过Customer对象，那么Customer代理类的实例一直不会被初始化，Hibernate不会执行任何select语句。以下代码试图在关闭Session后访问Customer游离对象：</p><p>tx = session.beginTransaction();<br />
              Customer customer=(Customer)session.load(Customer.class,new Long(1));<br />
              tx.commit();<br />
              session.close();<br />
              customer.getName();</p><p>由于引用变量customer引用的Customer代理类的实例在Session范围内始终没有被初始化，因此在执行customer.getName()方法时，Hibernate会抛出以下异常：</p><p>ERROR LazyInitializer:63 - Exception initializing proxy<br />
              net.sf.hibernate.HibernateException: Could not initialize proxy 
              - the owning Session was closed</p><p>由此可见，Customer代理类的实例只有在当前Session范围内才能被初始化。</p><p>3．net.sf.hibernate.Hibernate类的initialize()静态方法用于在Session范围内显式初始化代理类实例，isInitialized()方法用于判断代理类实例是否已经被初始化。例如：</p><p>tx = session.beginTransaction();<br />
              Customer customer=(Customer)session.load(Customer.class,new Long(1));<br />
              if(!Hibernate.isInitialized(customer)) <br />
              Hibernate.initialize(customer);<br />
              tx.commit();<br />
              session.close();<br />
              customer.getName();</p><p>以上代码在Session范围内通过Hibernate类的initialize()方法显式初始化了Customer代理类实例，因此当Session关闭后，可以正常访问Customer游离对象。</p><p>4．当应用程序访问代理类实例的getId()方法时，不会触发Hibernate初始化代理类实例的行为，例如：</p><p>tx = session.beginTransaction();<br />
              Customer customer=(Customer)session.load(Customer.class,new Long(1));<br />
              customer.getId();<br />
              tx.commit();<br />
              session.close();<br />
              customer.getName();</p><p>当
应用程序访问customer.getId()方法时，该方法直接返回Customer代理类实例的OID值，无需查询数据库。由于引用变量
customer始终引用的是没有被初始化的Customer代理类实例，因此当Session关闭后再执行customer.getName()方法，
Hibernate会抛出以下异常：</p><p>ERROR LazyInitializer:63 - Exception initializing proxy<br />
              net.sf.hibernate.HibernateException: Could not initialize proxy 
              - the owning Session was closed<br /></p><p><br /></p><br /><br /><img src ="http://www.blogjava.net/wiflish/aggbug/60362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-07-27 15:21 <a href="http://www.blogjava.net/wiflish/archive/2006/07/27/60362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate outer join属性浅析</title><link>http://www.blogjava.net/wiflish/archive/2006/07/19/59013.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Wed, 19 Jul 2006 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/07/19/59013.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/59013.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/07/19/59013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/59013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/59013.html</trackback:ping><description><![CDATA[outer join=true，hibernate对该关联进行外连接抓取；<br />outer join=false, hibernate对该关联不进行外连接抓取。<br /><br />当在hibernate.cfg.xml配置文件中的属性<br />&lt;property name="hibernate.max_fetch_depth"&gt;0&lt;/property&gt;<br />设置为0时，从全局关闭外连接抓取，此时outer-join属性无效。<br />&lt;property name="hibernate.max_fetch_depth"&gt;2&lt;/property&gt;<br />设置为&gt;0时，outer-join属性有效。<br /><img src ="http://www.blogjava.net/wiflish/aggbug/59013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-07-19 16:17 <a href="http://www.blogjava.net/wiflish/archive/2006/07/19/59013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate复合主键需注意的一点小问题(hibernate3)</title><link>http://www.blogjava.net/wiflish/archive/2006/06/30/55958.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Fri, 30 Jun 2006 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/06/30/55958.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/55958.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/06/30/55958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/55958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/55958.html</trackback:ping><description><![CDATA[hibernate的整个复合主键的长度（即复合主键中字段的长度加起来之和）不能超过500，否则会报如下错误：Specified key was too long. Max key length is 500<br />所以在进行复合主键映射时需指定复合主键中各字段的长度。<br /><br /><img src ="http://www.blogjava.net/wiflish/aggbug/55958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-06-30 14:40 <a href="http://www.blogjava.net/wiflish/archive/2006/06/30/55958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate+mysql存中文问题</title><link>http://www.blogjava.net/wiflish/archive/2006/06/30/55916.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Fri, 30 Jun 2006 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/06/30/55916.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/55916.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/06/30/55916.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/55916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/55916.html</trackback:ping><description><![CDATA[环境：hibernate3.1 + mysql4.1 + mysql-connector-java-3.0.11-stable-bin.jar驱动<br />当将mysql的默认字符集设置成default-character-set=gbk，插入中文字符时出现<br />例子：<br />Hibernate: insert into book (bookpagenum, published, bookname, bookauthor) values (?, ?, ?, ?)<br />could not bind value '待插入的中文字符' to parameter: 2; String index out of range: 9<br /><br />这是mysql的mysql-connector-java-3.0.11-stable-bin.jar驱动问题。更换驱动就好了<br />(比如：mysql-connector-java-3.1.13-bin.jar)<br /><br /><img src ="http://www.blogjava.net/wiflish/aggbug/55916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-06-30 11:47 <a href="http://www.blogjava.net/wiflish/archive/2006/06/30/55916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate属性配置一览表(摘自深入浅出hibernate)</title><link>http://www.blogjava.net/wiflish/archive/2006/06/28/55504.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Wed, 28 Jun 2006 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/06/28/55504.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/55504.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/06/28/55504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/55504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/55504.html</trackback:ping><description><![CDATA[
		<table style="width: 747px; height: 1030px;" align="center" border="1">
				<tbody>
						<tr>
								<td align="center">
										<b>属性名</b>
										<br />
								</td>
								<td align="center">
										<b>用  途</b>
										<br />
								</td>
						</tr>
						<tr>
								<td align="left" valign="middle" width="50%">
										<font size="2">hibernate.dialect
										<br /></font>
								</td>
								<td align="left" valign="middle" width="50%">
										<font size="2">数据库适配器(dialect),用于对特定数据库提供支持，其中包含了针对特定数据库特性的实现，如hibernate数据类型到特定数据库数据类型的映射等。
										<br /></font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">hibernate.default_schema<br /></font>
								</td>
								<td>
										<font size="2">在生成的SQL中，schema/tablespace的全限定名<br /></font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.session_factory_name<br /></font>
								</td>
								<td>
										<font size="2">把SessionFactory绑定到JNDI中的名称
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.max_fecth_depth<br /></font>
								</td>
								<td>
										<font size="2">对单根联合（一对一、多对一），设置外连接的最大深度，如果是0将关闭默认的外连接抓取。
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td valign="top">
										<font size="2">
												hibernate.jdbc.fetch_size<br /></font>
								</td>
								<td valign="top">
										<font size="2">非零值，用来设置JDBC获取的记录条数。
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.jdbc.batch_size<br /></font>
								</td>
								<td>
										<font size="2">非零值，指定了Hibernate进行每次批量提交阀值。</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.jdbc.use_scrollable_resultset<br /></font>
								</td>
								<td>
										<font size="2">设置是否允许Hibernate使用JDBC2提供的可滚动结果集，只有在使用用户自行提供的JDBC连接时，这个参数才是必需的。否则，Hibernate会根据连接的元数据（metadata）自行判定。
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.jdbc.use_streams_for_binary<br /></font>
								</td>
								<td>
										<font size="2">是否在从JDBC读写binary（二进制）或者serializable(可序列化)类型时，使用stream(流)
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.jdbc.use_get_generated_keys<br /></font>
								</td>
								<td>
										<font size="2">是否允许使用JDBC3的PreparedStatement.getGeneratedKeys()在插入后获取数据库自身生成的key。需要3.0以上版本的JDBC驱动和1.4或以上版本的JDK，<br />默认情况下，Hibernate会根据JDBC Connection元数据进行自行判定。<br /></font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.cglib.use_reflection_optimizer<br /></font>
								</td>
								<td>
										<font size="2">是否使用CGLIB来代替运行时反射操作(系统级别属性，默认为在可能时都使用CGLIB)
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.jndi.&lt;propertyName&gt;<br /></font>
								</td>
								<td>
										<font size="2">把propertyName这个属性传递给JNDI InitialContextFactory去(可选)
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.connection.isolation<br /></font>
								</td>
								<td>
										<font size="2">事务隔离级别（可选）
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.connection.&lt;propertyName&gt;<br /></font>
								</td>
								<td>
										<font size="2">把propertyName这个JDBC属性传递给DriverManager.getConnection()
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.connection.provider_class<br /></font>
								</td>
								<td>
										<font size="2">指定一个自定义的ConnectionProvider类名
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.cache.provider_class<br /></font>
								</td>
								<td>
										<font size="2">指定一个自定义的CacheProvider缓存提供者的类名</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.cache.use_minimal_puts<br /></font>
								</td>
								<td>
										<font size="2">是否优化第二级缓存操作，最小化缓存写入操作（使用于集群缓存）
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.cache.use_query_cache<br /></font>
								</td>
								<td>
										<font size="2">是否打开查询缓存（依然需要针对每个查询设置cacheable属性）
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.cache.region_prefix<br /></font>
								</td>
								<td>
										<font size="2">指定一个自定义的TransactionFactory类名，Hibernate Transaction API将会使用(默认是JDBCTransactionFactory)
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												jta.UserTransaction<br /></font>
								</td>
								<td>
										<font size="2">JTATransactionFactory用来从应用服务器获取JTA UserTransaction的JNDI名
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.transaction.manager_lookup_class<br /></font>
								</td>
								<td>
										<font size="2">TransactionManagerLookup的类名——当在JTA环境中启用JVM级缓存时使用
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.query.substitutions<br /></font>
								</td>
								<td>
										<font size="2">把Hibernate查询中的一些短语替换成SQL短语（短语可能为函数或者字符）
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.show_sql<br /></font>
								</td>
								<td>
										<font size="2">是否把执行的SQL语句输出到控制台
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
						<tr>
								<td>
										<font size="2">
												hibernate.hbm2dll.auto<br /></font>
								</td>
								<td>
										<font size="2">在SessionFactory创建后，自动输出schema创建语句到数据库，和create-drop同时使用的话，数据库schema会在SessionFactory显示关闭后被drop掉
										</font>
										<font size="2">
												<br />
										</font>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/wiflish/aggbug/55504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-06-28 11:39 <a href="http://www.blogjava.net/wiflish/archive/2006/06/28/55504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记(深入浅出hibernate)</title><link>http://www.blogjava.net/wiflish/archive/2006/06/22/54519.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Thu, 22 Jun 2006 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/06/22/54519.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/54519.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/06/22/54519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/54519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/54519.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span style="font-size: 16pt; font-family: 宋体;">解耦合设计目标：</span>
				<span style="font-size: 16pt;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;">
				<!--[if !supportLists]-->
				<span style="font-size: 14pt;" lang="EN-US">
						<span style="">1、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         
</span></span>
				</span>
				<!--[endif]-->
				<span style="font-size: 14pt; font-family: 宋体;">应用层解耦合——应用逻辑与数据逻辑相分离</span>
				<span style="font-size: 14pt;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-size: 12pt;" lang="EN-US">
						<span style="">       </span>
						<span style="">  </span>
						<span style=""> </span>
				</span>
				<span style="font-size: 12pt; font-family: 宋体;">在业务系统的业务逻辑实现过程中，我们应该避免业务逻辑代码中混杂数据访问代码，同样，在数据访问代码中，也应避免出现业务逻辑代码。</span>
				<span style="font-size: 12pt;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin-left: 36pt; text-indent: -36pt;">
				<!--[if !supportLists]-->
				<span style="font-size: 14pt;" lang="EN-US">
						<span style="">2、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         
</span></span>
				</span>
				<!--[endif]-->
				<span style="font-size: 14pt; font-family: 宋体;">资源层解耦合——逻辑结构与物理结构相分离</span>
				<span style="font-size: 14pt;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-size: 12pt;" lang="EN-US">
						<span style="">              </span>
				</span>
				<span style="font-size: 12pt; font-family: 宋体;">底层结构变动的情况下，尽量避免对上层结构产生影响。</span>
				<span style="font-size: 14pt;" lang="EN-US">
						<span style="">          </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-size: 12pt;" lang="EN-US">
						<span style="">              </span>
				</span>
				<span style="font-size: 12pt; font-family: 宋体;">物理结构：这里指的是我们无法控制的系统层面，如底层数据库接口。</span>
				<span style="font-size: 12pt;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-size: 12pt;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-size: 14pt;" lang="EN-US">        DAO</span>
				<span style="font-size: 14pt; font-family: 宋体;">（</span>
				<span style="font-size: 14pt;" lang="EN-US">Data Accesssor Object</span>
				<span style="font-size: 14pt; font-family: 宋体;">）模式是</span>
				<span style="font-size: 14pt;" lang="EN-US">Data
Accessor</span>
				<span style="font-size: 14pt; font-family: 宋体;">模式和</span>
				<span style="font-size: 14pt;" lang="EN-US">Active Domain Object</span>
				<span style="font-size: 14pt; font-family: 宋体;">模式的组合，其中</span>
				<span style="font-size: 14pt;" lang="EN-US">Data Accessor</span>
				<span style="font-size: 14pt; font-family: 宋体;">模式实现了数据访问与业务逻辑的分离，而</span>
				<span style="font-size: 14pt;" lang="EN-US">Active Domain Object</span>
				<span style="font-size: 14pt; font-family: 宋体;">模式实现了业务数据的对象化封装。</span>
				<span style="font-size: 14pt;" lang="EN-US">
						<br />
				</span>
		</p>
		<p class="MsoNormal">
				<span style="font-size: 14pt;" lang="EN-US">        DAO Accessor</span>
				<span style="font-size: 14pt; font-family: 宋体;">模式：将数据访问的实现机制加以封装，与数据的使用代码相分离，从外部来看，</span>
				<span style="font-size: 14pt;" lang="EN-US">DAO Accessor</span>
				<span style="font-size: 14pt; font-family: 宋体;">提供了黑盒式的数据存取接口。</span>
		</p>
		<p class="MsoNormal">
				<span style="font-size: 14pt; font-family: 宋体;">    </span>
				<span style="font-size: 14pt;" lang="EN-US">Domain
Object</span>
				<span style="font-size: 14pt; font-family: 宋体;">提供了对所面向领域内对象的封装。</span>
				<span style="font-size: 14pt;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/wiflish/aggbug/54519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-06-22 16:42 <a href="http://www.blogjava.net/wiflish/archive/2006/06/22/54519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate中inverse=true粗解</title><link>http://www.blogjava.net/wiflish/archive/2006/06/15/53032.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Thu, 15 Jun 2006 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/06/15/53032.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/53032.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/06/15/53032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/53032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/53032.html</trackback:ping><description><![CDATA[一个Person可以参加多个Event，一个Event有多个Person参加。<br />映射文件如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;!-- Person.hbm.xml --&gt;<br />&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping </span><span style="color: rgb(255, 0, 0);">package</span><span style="color: rgb(0, 0, 255);">="events"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="Person"</span><span style="color: rgb(255, 0, 0);"> table</span><span style="color: rgb(0, 0, 255);">="person"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="person_id"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />          </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">generator </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="native"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="age"</span><span style="color: rgb(255, 0, 0);"> length</span><span style="color: rgb(0, 0, 255);">="0"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="firstname"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="lastname"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">set </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="events"</span><span style="color: rgb(255, 0, 0);"> table</span><span style="color: rgb(0, 0, 255);">="person_event"</span><span style="color: rgb(255, 0, 0);"></span><span style="color: rgb(0, 0, 255);"></span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />          </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">key </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="person_id"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />          </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">many-to-many </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="event_id"</span><span style="color: rgb(255, 0, 0);"> class</span><span style="color: rgb(0, 0, 255);">="events.Event"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">set</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;!-- Event.hbm.xml --&gt;<br />&lt;</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">class </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="events.Event"</span><span style="color: rgb(255, 0, 0);"> table</span><span style="color: rgb(0, 0, 255);">="events"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="id"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="event_id"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">generator </span><span style="color: rgb(255, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">="native"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="date"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="events_date"</span><span style="color: rgb(255, 0, 0);"> type</span><span style="color: rgb(0, 0, 255);">="timestamp"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="title"</span><span style="color: rgb(255, 0, 0);"> column</span><span style="color: rgb(0, 0, 255);">="events_title"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">set </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="participants"</span><span style="color: rgb(255, 0, 0);"> table</span><span style="color: rgb(0, 0, 255);">="person_event"</span><span style="color: rgb(255, 0, 0);"> inverse</span><span style="color: rgb(0, 0, 255);">="true"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />          </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">key </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="event_id"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />          </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">many-to-many </span><span style="color: rgb(255, 0, 0);">column</span><span style="color: rgb(0, 0, 255);">="person_id"</span><span style="color: rgb(255, 0, 0);"> class</span><span style="color: rgb(0, 0, 255);">="events.Person"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">set</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">hibernate-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br />inverse=true的含义: 由双向关联另一方维护该关联,己方不维护该关联(只能进行查询操作)。在上述代码中，由Person方维护该&lt;many-to-many&gt;关系，示例代码如下(以向Person参与的Event中加入新的Event为例)：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">        Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> HibernateUtil.getSessionFactory().getCurrentSession();<br />        session.beginTransaction();<br />        Person p </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (Person) session.load(Person.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">, personId);<br />        Event e </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (Event) session.load(Event.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">, eventId);<br />       <b><font color="#0000ff"> p.getEvents().add(e);</font></b>//执行该代码时，hibernate会向中间表 person_event中插入person_id和event_id记录，如果换成<font color="#a52a2a"><b>e.getParticipants().add(p)</b></font>的话，该代码将不会被执行，即hibernate不会向表person_event中插入记录。<br />        session.getTransaction().commit();</span></div><br />要注意的一点：在双向关联的关系中，映射的column(和table)的值要一致(即要用相同的表名和列名)，不然设置为inverse="true"的这方将失去这个双向关系，而变成了一个单向关联。<br /><img src ="http://www.blogjava.net/wiflish/aggbug/53032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-06-15 17:16 <a href="http://www.blogjava.net/wiflish/archive/2006/06/15/53032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate中inverse属性的一个设置规则。</title><link>http://www.blogjava.net/wiflish/archive/2006/06/15/52955.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Thu, 15 Jun 2006 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/06/15/52955.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/52955.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/06/15/52955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/52955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/52955.html</trackback:ping><description><![CDATA[
		<font color="#ff0000">
				<b>The rules you have to remember are straightforward:  </b>
		</font>
		<br />
		<font color="#0000ff">  All bi-directional associations need one side as inverse. <br />  In a one-to-many association it has to be the many-side, <br />  In many-to-many association you can pick either side, there is no difference.</font>
<img src ="http://www.blogjava.net/wiflish/aggbug/52955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-06-15 11:30 <a href="http://www.blogjava.net/wiflish/archive/2006/06/15/52955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate配置属性hbm2dll.auto初步理解</title><link>http://www.blogjava.net/wiflish/archive/2006/05/26/48375.html</link><dc:creator>想飞的鱼</dc:creator><author>想飞的鱼</author><pubDate>Fri, 26 May 2006 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/wiflish/archive/2006/05/26/48375.html</guid><wfw:comment>http://www.blogjava.net/wiflish/comments/48375.html</wfw:comment><comments>http://www.blogjava.net/wiflish/archive/2006/05/26/48375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wiflish/comments/commentRss/48375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wiflish/services/trackbacks/48375.html</trackback:ping><description><![CDATA[配置文件hibernate.cfg.xml的hbm2dll属性有4个值：<br />1、validate：验证hbm2dll映射。<br />2、update：检查更新hbm2dll映射。<br />3、create：先drop数据库，在create数据库。<br />4、create-drop：先drop数据库，在create数据库，当SessionFactory关闭时，又drop数据库。<br /><img src ="http://www.blogjava.net/wiflish/aggbug/48375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wiflish/" target="_blank">想飞的鱼</a> 2006-05-26 16:59 <a href="http://www.blogjava.net/wiflish/archive/2006/05/26/48375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>