﻿<?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-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-Hibernate</title><link>http://www.blogjava.net/rain1102/category/37639.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 11 Nov 2009 17:25:44 GMT</lastBuildDate><pubDate>Wed, 11 Nov 2009 17:25:44 GMT</pubDate><ttl>60</ttl><item><title>Hibernate中主键增长步长为50的问题 Oracle</title><link>http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 11 Nov 2009 13:54:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/302019.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/302019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/302019.html</trackback:ping><description><![CDATA[<p>原文地址：http://jhyimu2005.javaeye.com/blog/514379<br />
先声明一下我用的框架是Spring + Hibernate + SpringMVC 数据库使用的是Oracle <br />
昨天遇到了一个特诡异的问题就是我使用Oracle序列，把主键的计数交给Hibernate处理，
Entity
@Table(name = "BIO_STUDY")
public class Study implements Serializable{
private static final long serialVersionUID = -5932941248053882057L;
private int id;
private Project project;
private String name;
private String description;
private Set&lt;Experiment&gt; experiments;
@Id
@Column(name = "ID")
@SequenceGenerator(name = "BIO_STUDY_SQ",
sequenceName = "BIO_STUDY_SQ" )
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BIO_STUDY_SQ")
public int getId() {
return id;
}

<p><br />
写完部署什么都没问题，可当我写了测试类进行测试时发现主键的初始值竟然是50，其步长亦是50，在同事的帮助下发现原来是Hibernate在做鬼，@SequenceGenerator中添加两个参数<span style="color: red">（allocationSize = 1, initialValue = 1）</span>就OK。通过查找Hibernate的资料发现原来是因为allocationSize的默认值是50.具体请参考http://www.oracle.com/technology/global/cn/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#SequenceGenerator <br />
<br />
<span style="color: red">只需要增加allocationSize = 1就可以</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/302019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-11-11 21:54 <a href="http://www.blogjava.net/rain1102/archive/2009/11/11/302019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AbstractTransactionalJUnit4SpringContextTests中的事务回滚</title><link>http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Nov 2009 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/301147.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/301147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/301147.html</trackback:ping><description><![CDATA[今天同事问了一个问题，关于annotation配置多对多关联映射以后，创建新的对象时候，为什么多对多的关系没有保存到关系表中。具体问题如下：<br />
当前有一个User和一个Role，它们是多对多关系，中间表为user_role存放user和role的id。部分User代码如下：<br />
<span style="color: #008000">@ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; @JoinTable(name = "user_role", <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;joinColumns = @JoinColumn(name = "user_id"), <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;inverseJoinColumns = @JoinColumn(name = "role_id"))&nbsp;&nbsp;&nbsp;&nbsp;</span><br />
&nbsp;public Set&lt;Role&gt; getRoles() {<br />
&nbsp;&nbsp;return roles;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void setRoles(Set&lt;Role&gt; roles) {<br />
&nbsp;&nbsp;this.roles = roles;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void addRole(Role role) {<br />
&nbsp;&nbsp;if (!this.roles.contains(role)) {<br />
&nbsp;&nbsp;&nbsp;this.roles.add(role);<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void removeRole(Role role) {<br />
&nbsp;&nbsp;this.roles.remove(role);<br />
&nbsp;}<br />
<br />
Role中的部分代码如下：<br />
<span style="color: #008000">@ManyToMany(<br />
&nbsp;&nbsp;&nbsp;cascade = {CascadeType.PERSIST, CascadeType.MERGE},<br />
&nbsp;&nbsp;&nbsp;mappedBy = "roles",<br />
&nbsp;&nbsp;&nbsp;targetEntity = User.class<br />
&nbsp;&nbsp;&nbsp;)</span><br />
&nbsp;public Set&lt;User&gt; getUsers() {<br />
&nbsp;&nbsp;return users;<br />
&nbsp;}<br />
<br />
而测试代码继承了AbstractTransactionalJUnit4SpringContextTests，代码如下：<br />
&nbsp;@Test<br />
&nbsp;public void testManyToMany() {<br />
&nbsp;&nbsp;Role oneRole = new Role();<br />
&nbsp;&nbsp;oneRole.setDescription("manager");<br />
&nbsp;&nbsp;oneRole.setEnabled(true);<br />
&nbsp;&nbsp;oneRole.setRoleName("manger");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Role twoRole = new Role();<br />
&nbsp;&nbsp;twoRole.setDescription("waitress");<br />
&nbsp;&nbsp;twoRole.setEnabled(true);<br />
&nbsp;&nbsp;twoRole.setRoleName("waitress");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;user.setEnabled(true);<br />
&nbsp;&nbsp;user.setPassword("jianghaiying");<br />
&nbsp;&nbsp;user.setUsername("Jiang HaiYing");<br />
&nbsp;&nbsp;user.addRole(oneRole);<br />
&nbsp;&nbsp;user.addRole(twoRole);<br />
&nbsp;&nbsp;userDAO.persist(user);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;userDAO.getConnection().commit();<br />
&nbsp;&nbsp;} catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
这样执行以后，打印出的信息如下：<br />
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
<br />
这时候问题出来了，为什么没有往关系表中插入数据？<br />
其实这并不是代码或者配置写错误了，在正式运行代码一切正常，而是AbstractTransactionalJUnit4SpringContextTests出的鬼，事实上多对多关联关系是由Hibernate去帮我们维护的，而AbstractTransactionalJUnit4SpringContextTests为了保持数据的清洁又会自动回滚。如何解决这个问题呢？<br />
方法：<br />
只需要在test方法上添加<span style="color: #008000">@Rollback(false)，</span>不让它回滚，一切正常了。这时候也可以去掉try语句了。<br />
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)<br />
Hibernate: insert into user_role (user_id, role_id) values (?, ?)<br />
Hibernate: insert into user_role (user_id, role_id) values (?, ?)<img src ="http://www.blogjava.net/rain1102/aggbug/301147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-11-04 20:58 <a href="http://www.blogjava.net/rain1102/archive/2009/11/04/301147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 参数设置一览表[转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/06/12/281873.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 12 Jun 2009 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/12/281873.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/281873.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/12/281873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/281873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/281873.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">属性名&nbsp;&nbsp; 用途&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.dialect&nbsp;&nbsp; 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值full.classname.of.Dialect</p>
<p style="text-indent: 2em">hibernate.show_sql&nbsp;&nbsp; 输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为debug。 eg.true | false</p>
<p style="text-indent: 2em">hibernate.format_sql&nbsp;&nbsp; 在log和console中打印出更漂亮的SQL。 取值true | false</p>
<p style="text-indent: 2em">hibernate.default_schema&nbsp;&nbsp; 在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. 取值SCHEMA_NAME</p>
<p style="text-indent: 2em">hibernate.default_catalog&nbsp;&nbsp; 在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. 取值CATALOG_NAME</p>
<p style="text-indent: 2em">hibernate.session_factory_name&nbsp;&nbsp; SessionFactory 创建后，将自动使用这个名字绑定到JNDI中. 取值jndi/composite/name</p>
<p style="text-indent: 2em">hibernate.max_fetch_depth&nbsp;&nbsp; 为单向关联(一对一, 多对一)的外连接抓取（outer join fetch）树设置最大深度. 值为0意味着将关闭默认的外连接抓取. 取值 建议在0到3之间取值&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.default_batch_fetch_size&nbsp;&nbsp; 为Hibernate关联的批量抓取设置默认数量. 取值 建议的取值为4, 8, 和16</p>
<p style="text-indent: 2em">hibernate.default_entity_mode&nbsp;&nbsp; 为由这个SessionFactory打开的所有Session指定默认的实体表现模式. 取值dynamic-map, dom4j, pojo</p>
<p style="text-indent: 2em">hibernate.order_updates&nbsp;&nbsp; 强制Hibernate按照被更新数据的主键，为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 取值true | false</p>
<p style="text-indent: 2em">hibernate.generate_statistics&nbsp;&nbsp; 如果开启, Hibernate将收集有助于性能调节的统计数据. 取值true | false</p>
<p style="text-indent: 2em">hibernate.use_identifer_rollback&nbsp;&nbsp; 如果开启, 在对象被删除时生成的标识属性将被重设为默认值. 取值true | false</p>
<p style="text-indent: 2em">hibernate.use_sql_comments&nbsp;&nbsp; 如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为false. 取值true | false</p>
<p style="text-indent: 2em">表 3.4.&nbsp;&nbsp; Hibernate JDBC和连接(connection)属性</p>
<p style="text-indent: 2em">属性名&nbsp;&nbsp; 用途&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.jdbc.fetch_size&nbsp;&nbsp; 非零值，指定JDBC抓取数量的大小 (调用Statement.setFetchSize()).&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.jdbc.batch_size&nbsp;&nbsp; 非零值，允许Hibernate使用JDBC2的批量更新. 取值 建议取5到30之间的值&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.jdbc.batch_versioned_data&nbsp;&nbsp; 如果你想让你的JDBC驱动从executeBatch()返回正确的行计数 , 那么将此属性设为true(开启这个选项通常是安全的). 同时，Hibernate将为自动版本化的数据使用批量DML. 默认值为false. eg.true | false</p>
<p style="text-indent: 2em">hibernate.jdbc.factory_class&nbsp;&nbsp; 选择一个自定义的Batcher. 多数应用程序不需要这个配置属性. eg.classname.of.Batcher</p>
<p style="text-indent: 2em">hibernate.jdbc.use_scrollable_resultset&nbsp;&nbsp; 允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时，这个选项才是必要的, 否则Hibernate会使用连接的元数据. 取值true | false</p>
<p style="text-indent: 2em">hibernate.jdbc.use_streams_for_binary&nbsp;&nbsp; 在JDBC读写binary (二进制)或serializable (可序列化) 的类型时使用流(stream)(系统级属性). 取值true | false</p>
<p style="text-indent: 2em">hibernate.jdbc.use_get_generated_keys&nbsp;&nbsp; 在数据插入数据库之后，允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题，请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. 取值true|false</p>
<p style="text-indent: 2em">hibernate.connection.provider_class&nbsp;&nbsp; 自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接. 取值classname.of.ConnectionProvider</p>
<p style="text-indent: 2em">hibernate.connection.isolation&nbsp;&nbsp; 设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. 取值1, 2, 4, 8</p>
<p style="text-indent: 2em">hibernate.connection.autocommit&nbsp;&nbsp; 允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). 取值true | false</p>
<p style="text-indent: 2em">hibernate.connection.release_mode&nbsp;&nbsp; 指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement, 这样在每次JDBC调用后，都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction. 取值on_close | after_transaction | after_statement | auto</p>
<p style="text-indent: 2em">hibernate.connection.&lt;propertyName&gt;&nbsp;&nbsp; 将JDBC属性propertyName传递到DriverManager.getConnection()中去.&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.jndi.&lt;propertyName&gt;&nbsp;&nbsp; 将属性propertyName传递到JNDI InitialContextFactory中去.&nbsp;&nbsp;</p>
<p style="text-indent: 2em">表 3.5.&nbsp;&nbsp; Hibernate缓存属性</p>
<p style="text-indent: 2em">属性名&nbsp;&nbsp; 用途&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.cache.provider_class&nbsp;&nbsp; 自定义的CacheProvider的类名. 取值classname.of.CacheProvider</p>
<p style="text-indent: 2em">hibernate.cache.use_minimal_puts&nbsp;&nbsp; 以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中，这个设置对的集群缓存非常有用, 对集群缓存的实现而言，默认是开启的. 取值true|false</p>
<p style="text-indent: 2em">hibernate.cache.use_query_cache&nbsp;&nbsp; 允许查询缓存, 个别查询仍然需要被设置为可缓存的. 取值true|false</p>
<p style="text-indent: 2em">hibernate.cache.use_second_level_cache&nbsp;&nbsp; 能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定&lt;cache&gt;的类，会默认开启二级缓存. 取值true|false</p>
<p style="text-indent: 2em">hibernate.cache.query_cache_factory&nbsp;&nbsp; 自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache. 取值classname.of.QueryCache</p>
<p style="text-indent: 2em">hibernate.cache.region_prefix&nbsp;&nbsp; 二级缓存区域名的前缀. 取值prefix</p>
<p style="text-indent: 2em">hibernate.cache.use_structured_entries&nbsp;&nbsp; 强制Hibernate以更人性化的格式将数据存入二级缓存. 取值true|false</p>
<p style="text-indent: 2em">表 3.6.&nbsp;&nbsp; Hibernate事务属性</p>
<p style="text-indent: 2em">属性名&nbsp;&nbsp; 用途&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.transaction.factory_class&nbsp;&nbsp; 一个TransactionFactory的类名, 用于Hibernate Transaction API (默认为JDBCTransactionFactory). 取值classname.of.TransactionFactory</p>
<p style="text-indent: 2em">jta.UserTransaction&nbsp;&nbsp; 一个JNDI名字，被JTATransactionFactory用来从应用服务器获取JTA UserTransaction. 取值jndi/composite/name</p>
<p style="text-indent: 2em">hibernate.transaction.manager_lookup_class&nbsp;&nbsp; 一个TransactionManagerLookup的类名 - 当使用JVM级缓存，或在JTA环境中使用hilo生成器的时候需要该类. 取值classname.of.TransactionManagerLookup</p>
<p style="text-indent: 2em">hibernate.transaction.flush_before_completion&nbsp;&nbsp; 如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。取值true | false</p>
<p style="text-indent: 2em">hibernate.transaction.auto_close_session&nbsp;&nbsp; 如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。取值true | false</p>
<p style="text-indent: 2em">表 3.7.&nbsp;&nbsp; 其他属性</p>
<p style="text-indent: 2em">属性名&nbsp;&nbsp; 用途&nbsp;&nbsp;</p>
<p style="text-indent: 2em">hibernate.current_session_context_class&nbsp;&nbsp; 为"当前" Session指定一个(自定义的)策略。eg.jta | thread | custom.Class</p>
<p style="text-indent: 2em">hibernate.query.factory_class&nbsp;&nbsp; 选择HQL解析器的实现. 取值org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory</p>
<p style="text-indent: 2em">hibernate.query.substitutions&nbsp;&nbsp; 将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). 取值hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</p>
<p style="text-indent: 2em">hibernate.hbm2ddl.auto&nbsp;&nbsp; 在SessionFactory创建时，自动检查数据库结构，或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时，将drop掉数据库schema. 取值validate | update | create | create-drop</p>
<p style="text-indent: 2em">hibernate.cglib.use_reflection_optimizer&nbsp;&nbsp; 开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性. 取值true | false</p>
<p style="text-indent: 2em">3.4.1.&nbsp;&nbsp; SQL方言 你应当总是为你的数据库将hibernate.dialect属性设置成正确的 org.hibernate.dialect.Dialect子类. 如果你指定一种方言, Hibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫.</p>
<p style="text-indent: 2em">表 3.8.&nbsp;&nbsp; Hibernate SQL方言 (hibernate.dialect)</p>
<p style="text-indent: 2em">RDBMS 方言&nbsp;&nbsp;</p>
<p style="text-indent: 2em">DB2 org.hibernate.dialect.DB2Dialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">DB2 AS/400 org.hibernate.dialect.DB2400Dialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">DB2 OS390 org.hibernate.dialect.DB2390Dialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">PostgreSQL org.hibernate.dialect.PostgreSQLDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">MySQL org.hibernate.dialect.MySQLDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Oracle (any version) org.hibernate.dialect.OracleDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Sybase org.hibernate.dialect.SybaseDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Microsoft SQL Server org.hibernate.dialect.SQLServerDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">SAP DB org.hibernate.dialect.SAPDBDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Informix org.hibernate.dialect.InformixDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">HypersonicSQL org.hibernate.dialect.HSQLDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Ingres org.hibernate.dialect.IngresDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Progress org.hibernate.dialect.ProgressDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Mckoi SQL org.hibernate.dialect.MckoiDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Interbase org.hibernate.dialect.InterbaseDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Pointbase org.hibernate.dialect.PointbaseDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">FrontBase org.hibernate.dialect.FrontbaseDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">Firebird org.hibernate.dialect.FirebirdDialect&nbsp;&nbsp;</p>
<p style="text-indent: 2em">表 3.9.&nbsp;&nbsp; Hibernate日志类别</p>
<p style="text-indent: 2em">类别&nbsp;&nbsp; 功能&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.SQL&nbsp;&nbsp; 在所有SQL DML语句被执行时为它们记录日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.type&nbsp;&nbsp; 为所有JDBC参数记录日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.tool.hbm2ddl&nbsp;&nbsp; 在所有SQL DDL语句执行时为它们记录日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.pretty&nbsp;&nbsp; 在session清洗(flush)时，为所有与其关联的实体(最多20个)的状态记录日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.cache&nbsp;&nbsp; 为所有二级缓存的活动记录日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.transaction&nbsp;&nbsp; 为事务相关的活动记录日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.jdbc&nbsp;&nbsp; 为所有JDBC资源的获取记录日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.hql.AST&nbsp;&nbsp; 在解析查询的时候,记录HQL和SQL的AST分析日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.secure&nbsp;&nbsp; 为JAAS认证请求做日志&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate&nbsp;&nbsp; 为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助)&nbsp;&nbsp;</p>
<p style="text-indent: 2em">表 3.10. JTA TransactionManagers</p>
<p style="text-indent: 2em">Transaction工厂类&nbsp;&nbsp; 应用程序服务器&nbsp;&nbsp;</p>
<p style="text-indent: 2em">org.hibernate.transaction.JBossTransactionManagerLookup&nbsp;&nbsp; JBoss</p>
<p style="text-indent: 2em">org.hibernate.transaction.WeblogicTransactionManagerLookup&nbsp;&nbsp; Weblogic</p>
<p style="text-indent: 2em">org.hibernate.transaction.WebSphereTransactionManagerLookup&nbsp;&nbsp; WebSphere</p>
<p style="text-indent: 2em">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup&nbsp;&nbsp; WebSphere 6</p>
<p style="text-indent: 2em">org.hibernate.transaction.OrionTransactionManagerLookup&nbsp;&nbsp; Orion</p>
<p style="text-indent: 2em">org.hibernate.transaction.ResinTransactionManagerLookup&nbsp;&nbsp; Resin</p>
<p style="text-indent: 2em">org.hibernate.transaction.JOTMTransactionManagerLookup&nbsp;&nbsp; JOTM</p>
<p style="text-indent: 2em">org.hibernate.transaction.JOnASTransactionManagerLookup&nbsp;&nbsp; JOnAS</p>
<p style="text-indent: 2em">org.hibernate.transaction.JRun4TransactionManagerLookup&nbsp;&nbsp; JRun4</p>
<p style="text-indent: 2em">org.hibernate.transaction.BESTransactionManagerLookup&nbsp;&nbsp; Borland ES</p><img src ="http://www.blogjava.net/rain1102/aggbug/281873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-06-12 17:02 <a href="http://www.blogjava.net/rain1102/archive/2009/06/12/281873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的回调与拦截机制[转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/06/11/281513.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 11 Jun 2009 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/11/281513.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/281513.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/11/281513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/281513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/281513.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">在某些情况下，我们需要对实体的</span>CURD<span style="font-family: 宋体">操作进行捕获并执行一些操作，这可以通过数据库触发器来实现，但是正如我们上一节中所分析的，由于触发器的执行对</span>Hibernate Session<span style="font-family: 宋体">是透明的，因此会带来很多问题（参见上一节）。为此</span>Hibernate<span style="font-family: 宋体">提供了一些专门用于捕获监听实体</span>CURD<span style="font-family: 宋体">操作的接口，通过这些接口可以实现类似触发器的功能，能够在实体发生</span>CURD<span style="font-family: 宋体">操作时捕获事件，并且执行相应的动作逻辑。在</span>Hibernate<span style="font-family: 宋体">中这些接口是：</span>Lifecycle,Validatable,Interceptor,<span style="font-family: 宋体">下面我们就分别讲解怎样通过这些接口，实现回调拦截的技术细节。</span></p>
<p>A<span style="font-family: 宋体">、</span>Lifecycle<span style="font-family: 宋体">与</span>Validatable</p>
<p>&nbsp;<span style="font-family: 宋体">在</span>Hibernate<span style="font-family: 宋体">中</span>Lifecycle<span style="font-family: 宋体">接口定义如下：</span></p>
<p>public interface Lifecycle{</p>
<p>&nbsp;/**</p>
<p>&nbsp;&nbsp; <span style="font-family: 宋体">在实体对象执行</span>save/insert<span style="font-family: 宋体">操作之前触发</span></p>
<p>&nbsp;**/</p>
<p>&nbsp;public boolean onSave(Session session) throws CallbackException;</p>
<p>&nbsp;/**</p>
<p>&nbsp;&nbsp; <span style="font-family: 宋体">在</span>session.update()<span style="font-family: 宋体">执行之前触发</span></p>
<p>&nbsp;**/</p>
<p>&nbsp;public boolean onUpdate(Session session) throws CallbackException;</p>
<p>&nbsp;/**</p>
<p>&nbsp;<span style="font-family: 宋体">在实体对象执行</span>delete<span style="font-family: 宋体">操作之前触发</span></p>
<p>**/</p>
<p>public boolean onDelete(Session session) throws CallbackException;</p>
<p>/**</p>
<p>&nbsp;<span style="font-family: 宋体">在实体对象加载之后触发</span></p>
<p>**/</p>
<p>public void onLoad(Session session) throws CallbackException;</p>
<p>}</p>
<p><span style="font-family: 宋体">实体对象可以实现</span>Lifecycle<span style="font-family: 宋体">接口，来获得在持久化阶段捕获</span>CURD<span style="font-family: 宋体">事件，并执行相应动作的能如下所示：</span></p>
<p>public class User implements Serializable,Lifecycle{</p>
<p>&nbsp;public boolean onSave(Session s) throws CallbackException{</p>
<p><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p>return false;</p>
<p><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p>&nbsp;}</p>
<p>&nbsp;public boolean onUpdate(Session s) throws CallbackException{</p>
<p><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p>return true;</p>
<p><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p>&nbsp;}</p>
<p>&nbsp;public boolean onDelete(Session s) throws CallbackException{</p>
<p><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p>return false;</p>
<p><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p>&nbsp;}</p>
<p>&nbsp;public boolean onLoad(Session s) throws CallbackException{</p>
<p><span style="font-family: 宋体">&#8230;&#8230;</span></p>
<p>&nbsp;}</p>
<p>}</p>
<p><span style="font-family: 宋体">对于</span>onSave,onUpdate,onDelete<span style="font-family: 宋体">方法，如果返回</span>true<span style="font-family: 宋体">则意味着需要终止执行对应的操作过程。如果在运行时抛出</span>CallbackException<span style="font-family: 宋体">，对应的操作也会被终止。</span></p>
<p><span style="font-family: 宋体">注意在接口中对应的方法中，不要去通过方法的</span>Session<span style="font-family: 宋体">参数执行持久化操作，在这些方法中</span>Session<span style="font-family: 宋体">无法正常使用，如果必须要执行一些持久化操作，那么需要进行特殊的处理，我们将在</span>Interceptor<span style="font-family: 宋体">部分详细讲解。</span></p>
<p>Hibernate<span style="font-family: 宋体">中还定义了</span>Validatable<span style="font-family: 宋体">接口，该接口定义如下：</span></p>
<p>public interface Validatable{</p>
<p>&nbsp;public void validate() throws ValidationFailure;</p>
<p>}</p>
<p>Validatable<span style="font-family: 宋体">接口是用来实现数据验证的，实体类实现</span>Validatable<span style="font-family: 宋体">接口，并在接口的</span>validate<span style="font-family: 宋体">方法中实现数据验证逻辑，以保证数据输入的合法性。</span>validate<span style="font-family: 宋体">方法将会在实体对象持久化前得到调用进行数据验证，与</span>Lifecycle<span style="font-family: 宋体">接口中的方法不同，</span>Validatable.validate()<span style="font-family: 宋体">方法在实体生命周期中可能被多次调用，因此此方法应该仅限于数据合法性的验证，而不应该实现业务逻辑的验证。</span></p>
<p>B<span style="font-family: 宋体">、</span>Interceptor:</p>
<p><span style="font-family: 宋体">以上是</span>Hibernate<span style="font-family: 宋体">提供的</span>Lifecycle<span style="font-family: 宋体">接口和</span>Validatable<span style="font-family: 宋体">接口，以及使用方法，这两个方法定义了一种自然的回调机制，但是如我们所见，如果想实现对实体的回调拦截，那么相应的实体对象必须实现这两个</span>Hibernate<span style="font-family: 宋体">原生接口，这就使代码的可移植性大大下降，因为此时实体类已经不再是一个</span>POJO<span style="font-family: 宋体">了，</span>Hibernate<span style="font-family: 宋体">的那些天才的设计者们也已经意识到了这个问题，所以又提供了</span>Interceptor<span style="font-family: 宋体">接口，为持久化事件的捕获和处理提供了一个非入侵性的解决方案，</span>Interceptor<span style="font-family: 宋体">接口通过设置注入来实现持久化事件的捕获和处理，这是典型的</span>IOC<span style="font-family: 宋体">（控制反转）设计思想。下面我们就讲解</span>Interceptor<span style="font-family: 宋体">接口的技术细节和使用方法。</span></p>
<p>Hibernate<span style="font-family: 宋体">中的</span>Interceptor<span style="font-family: 宋体">接口定义如下：</span></p>
<p>public interface Interceptor{</p>
<p>&nbsp;//<span style="font-family: 宋体">对象初始化之前调用，这时实体对象刚刚被创建，各个属性还都为</span>null,<span style="font-family: 宋体">如果在这个方法中修改了实体对象的数据，那么返回</span>true<span style="font-family: 宋体">，否则返回</span>null.</p>
<p>&nbsp;public boolean onLoad(Object entity,Serializable id,Object[] state,</p>
<p>String[] propertyNames,Type[] types) throws CallbackException;</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//Session.flush()<span style="font-family: 宋体">在进行脏数据检查时，如果发现实体对象数据已脏，就调用此方法</span></p>
<p>&nbsp;public boolean onFlushDirty(Object entity,Serializable id,Object[] state,</p>
<p>String[] propertyNames,Type[] types) throws CallbackException;</p>
<p>&nbsp;//<span style="font-family: 宋体">实体对象被保存前调用，如果在这个方法中修改了实体对象的数据，那么返回</span>true<span style="font-family: 宋体">，否则返回</span>null.</p>
<p>&nbsp;public boolean onSave(Object entity,Serializable id,Object[] state,</p>
<p>String[] propertyNames,Type[] types) throws CallbackException;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">通过</span>Session<span style="font-family: 宋体">删除一个实体对象前调用</span></p>
<p>&nbsp;public boolean onDelete(Object entity,Serializable id,Object[] state,</p>
<p>String[] propertyNames,Type[] types) throws CallbackException;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //Session<span style="font-family: 宋体">执行</span>flush()<span style="font-family: 宋体">之前调用</span></p>
<p>public boolean preFlush(Iterator entities) throws CallbackException;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //Session<span style="font-family: 宋体">执行</span>flush()<span style="font-family: 宋体">之后，所有的</span>SQL<span style="font-family: 宋体">语句都执行完毕后调用</span></p>
<p>public boolean postFlush(Iterator entities) throws CallbackException;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">当执行</span>saveOrUpdate<span style="font-family: 宋体">方法时调用，判断实体对象是否已经保存</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public Boolean isUnsaved(Object entity);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">执行</span>Session.flush()<span style="font-family: 宋体">方法时，调用此方法判断该对象是否为脏对象，这提供了脏数据检查的另一个回调拦截机制</span></p>
<p>public int[] findDirty(Object entity,Serializable id,Object[] state,</p>
<p>String[] propertyNames,Type[] types) throws CallbackException;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体">当</span>Session<span style="font-family: 宋体">构造实体类实例前调用，如果返回</span>null,Hibernate<span style="font-family: 宋体">会按照默认方式构造实体类对象实例</span></p>
<p>public Object findDirty(Class clazz,Serializable id) throws CallbackException;</p>
<p>}</p>
<p>Intercepter<span style="font-family: 宋体">不需要实体对象来实现，而是通过开发人员定义一个实现</span>Interceptor<span style="font-family: 宋体">接口的类，然后在创建</span>Hibernate Session<span style="font-family: 宋体">时，通过将</span>Interceptor<span style="font-family: 宋体">对象设置进所创建的</span>Session<span style="font-family: 宋体">，这样通过这个</span>Session<span style="font-family: 宋体">来操作的实体对象，就都会具有对持久化动作的回调拦截能力。在</span>Hibernate<span style="font-family: 宋体">中</span>Interceptor<span style="font-family: 宋体">对象共有两种用法，如下所述：</span></p>
<p>1<span style="font-family: 宋体">、</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionFactory.openSession(Interceptor)<span style="font-family: 宋体">：为每个</span>Session<span style="font-family: 宋体">实例分配一个拦截</span>Interceptor<span style="font-family: 宋体">，这个拦截接口对象，存放在</span>Session<span style="font-family: 宋体">范围内，为每个</span>Session<span style="font-family: 宋体">实例所专用。</span></p>
<p>2<span style="font-family: 宋体">、</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration.setInterceptor(Interceptor):<span style="font-family: 宋体">为</span>SessionFactory<span style="font-family: 宋体">实例分配一个</span>Interceptor<span style="font-family: 宋体">实例，这个</span>Interceptor<span style="font-family: 宋体">实例存放在</span>SessionFactory<span style="font-family: 宋体">范围内，被每个</span>Session<span style="font-family: 宋体">实例所共享。</span></p>
<p>A<span style="font-family: 宋体">、</span>Interceptor<span style="font-family: 宋体">的典型应用：</span></p>
<p><span style="font-family: 宋体">下面我实现一个利用</span>Interceptor<span style="font-family: 宋体">接口实现日志数据稽核的功能，所谓日志数据稽核就是针对一些关键操作进行记录，以便作为业务跟踪的基础依据。</span></p>
<p><span style="font-family: 宋体">首先定义用于记录操作的实体：</span></p>
<p>public class AudiLog implements Serializable{</p>
<p>&nbsp;private String id;</p>
<p>&nbsp;private String user;</p>
<p>&nbsp;private String action;</p>
<p>&nbsp;private String entityName;</p>
<p>&nbsp;private String comment;</p>
<p>&nbsp;private Long logtime;</p>
<p>&nbsp;&#8230;getter/setter&#8230;</p>
<p>}</p>
<p><span style="font-family: 宋体">接下来定义</span>Interceptor<span style="font-family: 宋体">接口的实现类和用于持久化操作的</span>AuditDAO<span style="font-family: 宋体">类：</span></p>
<p>package com.lbs.apps.unemployment.subsidy.beforeinfoimport.util;</p>
<p>import net.sf.hibernate.Session;</p>
<p>import net.sf.hibernate.Interceptor;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.Serializable;</p>
<p>import net.sf.hibernate.type.Type;</p>
<p>import net.sf.hibernate.HibernateException;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Iterator;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Set;</p>
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.HashSet;</p>
<p>import com.neusoft.entity.User;</p>
<p>public class MyInterceptor implements Interceptor{</p>
<p>&nbsp;private Set insertset=new HashSet();</p>
<p>&nbsp;private Set updateset=new HashSet();</p>
<p>&nbsp;private Session session;</p>
<p>&nbsp;private String userID;</p>
<p>&nbsp;public void setSession(Session session){</p>
<p>&nbsp;&nbsp;&nbsp; this.session=session</p>
<p><span style="font-family: 宋体">　｝</span></p>
<p><span style="font-family: 宋体">　</span>public void setUserID(String id){</p>
<p>&nbsp;&nbsp; this.userID=id;</p>
<p>&nbsp;}</p>
<p>&nbsp;public boolean onLoad(Object object, Serializable serializable,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] objectArray, String[] stringArray,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type[] typeArray) {</p>
<p>&nbsp;&nbsp;&nbsp; return false;</p>
<p>&nbsp;}</p>
<p>&nbsp;public boolean onFlushDirty(Object object, Serializable serializable,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] objectArray, Object[] objectArray3,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] stringArray, Type[] typeArray) {</p>
<p>&nbsp;&nbsp;&nbsp; if(object instanceof User){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertset.add(object);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; return false;</p>
<p>&nbsp;}</p>
<p>&nbsp;public boolean onSave(Object object, Serializable serializable,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] objectArray, String[] stringArray,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type[] typeArray) {</p>
<p>&nbsp;&nbsp;&nbsp; if(object instanceof User){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updateset.add(object);</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; return false;</p>
<p>&nbsp;}</p>
<p>&nbsp;public void onDelete(Object object, Serializable serializable,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] objectArray, String[] stringArray,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type[] typeArray) {</p>
<p>&nbsp;}</p>
<p>&nbsp;public void preFlush(Iterator iterator) {</p>
<p>&nbsp;}</p>
<p>&nbsp;public void postFlush(Iterator iterator) {</p>
<p>try{</p>
<p>&nbsp;if(insertset.size()&gt;0){</p>
<p>&nbsp;&nbsp; AuditDAO.dolog(&#8220;insert&#8221;,userID,inserset,session.connection);</p>
<p>&nbsp;}</p>
<p>&nbsp;if(updateset.size()&gt;0){</p>
<p>&nbsp;&nbsp; AuditDAO.dolog(&#8220;update&#8221;,userID,updateset,session.connection);</p>
<p>&nbsp;}</p>
<p>}catch(HibernateException he){</p>
<p>&nbsp;he.printStackTrace();</p>
<p>}</p>
<p>&nbsp;}</p>
<p>&nbsp;public Boolean isUnsaved(Object object) {</p>
<p>&nbsp;&nbsp;&nbsp; return null;</p>
<p>&nbsp;}</p>
<p>&nbsp;public int[] findDirty(Object object, Serializable serializable,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] objectArray, Object[] objectArray3,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] stringArray, Type[] typeArray) {</p>
<p>&nbsp;&nbsp;&nbsp; return null;</p>
<p>&nbsp;}</p>
<p>&nbsp;public Object instantiate(Class class0, Serializable serializable) {</p>
<p>&nbsp;&nbsp;&nbsp; return "";</p>
<p>&nbsp;}</p>
<p>}</p>
<p>public class AuditDAO{</p>
<p>&nbsp;public static void doLog(String action,String userID,Set modifySet,Connection connection){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Session tempsession=HibernateUtil.getSessionFactory().openSession(connection);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; try{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it=modifyset.iterator();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User user=(User)it.next();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AudiLog log=new AudiLog();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.setUserID(userID);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.setAction(action);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.setComment(user.toString());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.setLogTime(new Long(Calendar.getInstance().getTime().getTime()));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempsession.save(log);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new CallbackException(e);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }finally{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{</p>
<p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempsesson.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(HibernateException he){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new CallbackException(he);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;}</p>
<p>}</p>
<p><span style="font-family: 宋体">最后看一下业务逻辑主程序：</span></p>
<p>SessionFactory sessionfactory=config.buildSessionFactory();</p>
<p>MyInterceptor it=new MyInterceptor();</p>
<p>session=sessionfactory().openSession(it);</p>
<p>it.setUserID(&#8220;currentUser&#8221;);</p>
<p>it.setSession(session);</p>
<p>User user=new User();</p>
<p>user.setName(&#8220;zx&#8221;);</p>
<p>Transaction tx=session.beginTransaction();</p>
<p>session.save(user);</p>
<p>tx.commit();</p>
<p>session.close();</p>
<span style="font-size: 10.5pt; font-family: 宋体">以上示例代码中，在创建</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">时，设置</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Interceptor</span><span style="font-size: 10.5pt; font-family: 宋体">实例对象，当执行到</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">session.save(user)</span><span style="font-size: 10.5pt; font-family: 宋体">前，会触发</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">onSave()</span><span style="font-size: 10.5pt; font-family: 宋体">方法，当执行</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">tx.commit()</span><span style="font-size: 10.5pt; font-family: 宋体">时，会执行</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">flush()</span><span style="font-size: 10.5pt; font-family: 宋体">，在执行该方法后会触发</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">postFlush()</span><span style="font-size: 10.5pt; font-family: 宋体">方法，这个方法通过</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">AuditDAO</span><span style="font-size: 10.5pt; font-family: 宋体">进行持久化保存业务日志，在这个类中的红色部分时有关持久化操作部分，我们并没有使用原有的</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">实例，这是因为要避免</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">内部状态混乱，因此我们依托当前</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">的</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">JDBC Connection</span><span style="font-size: 10.5pt; font-family: 宋体">创建了一个临时</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">用于保存操作记录，在这个持久化操作中没有启动事务，这是因为临时</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">中的</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">JDBC Connection</span><span style="font-size: 10.5pt; font-family: 宋体">是与外围调用</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Interceptor</span><span style="font-size: 10.5pt; font-family: 宋体">的</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">共享</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">,</span><span style="font-size: 10.5pt; font-family: 宋体">而事务已经在外围</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Session</span><span style="font-size: 10.5pt; font-family: 宋体">的</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">JDBC Connection</span><span style="font-size: 10.5pt; font-family: 宋体">上启动。这是在拦截方法中进行持久化操作的标准方法。总之</span><span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'">Interceptor</span><span style="font-size: 10.5pt; font-family: 宋体">提供了非入侵性的回调拦截机制，使我们可以方便而且优雅的实现一些持久化操作的特殊需求。</span><img src ="http://www.blogjava.net/rain1102/aggbug/281513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-06-11 16:49 <a href="http://www.blogjava.net/rain1102/archive/2009/06/11/281513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Interceptor中onFlushDirty方法的参数previousState一直是空</title><link>http://www.blogjava.net/rain1102/archive/2009/06/05/280270.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 05 Jun 2009 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/05/280270.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/280270.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/05/280270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/280270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/280270.html</trackback:ping><description><![CDATA[Interceptor中onFlushDirty方法的参数previousState一直是空, 经检查发现原来在更新对象的时候使用saveOrUpdate方法的缘故, 替换使用merge问题就解决了.<br /><img src ="http://www.blogjava.net/rain1102/aggbug/280270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-06-05 20:58 <a href="http://www.blogjava.net/rain1102/archive/2009/06/05/280270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 与 Spring 多数据源的配置【转载】</title><link>http://www.blogjava.net/rain1102/archive/2009/03/09/258670.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 09 Mar 2009 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/03/09/258670.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/258670.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/03/09/258670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/258670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/258670.html</trackback:ping><description><![CDATA[<p>Spring2.0.1以后的版本已经支持配置多数据源，并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源，每个数据源的表结构都是相同的，所以要求数据源的变动对于编码人员来说是透明，也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下： <br />
一、首先需要写一个静态的键值对照类：</p>
<p>
<div>代码</div>
<div>
<div>
<div></div>
<ol>
    <li><span><span>package</span><span>&nbsp;cn.com.xinli.ccp.dynamicds; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>public</span><span>&nbsp;</span><span>class</span><span>&nbsp;DataSourceMap&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>final</span><span>&nbsp;String&nbsp;Admin=</span><span>"Admin"</span><span>; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>final</span><span>&nbsp;String&nbsp;Yxh&nbsp;=&nbsp;</span><span>"Yxh"</span><span>; &nbsp;&nbsp;</span>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>这个类主要在使用的时候当作获得数据源的标志使用。 <br />
二、建立一个获得和设置上下文的类： <br />
<div>代码</div>
<div>
<div>
<div></div>
<ol>
    <li><span><span>package</span><span>&nbsp;cn.com.xinli.ccp.dynamicds; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>public</span><span>&nbsp;</span><span>class</span><span>&nbsp;CustomerContextHolder&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>private</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>final</span><span>&nbsp;ThreadLocal&nbsp;contextHolder&nbsp;=&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>new</span><span>&nbsp;ThreadLocal(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>void</span><span>&nbsp;setCustomerType(String&nbsp;customerType)&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextHolder.set(customerType); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>static</span><span>&nbsp;String&nbsp;getCustomerType()&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span><span>&nbsp;(String)&nbsp;contextHolder.get(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>void</span><span>&nbsp;clearCustomerType()&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contextHolder.remove(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<br />
这个主要负责设置上下文环境和获得上下文环境。 <br />
三、建立动态数据源类，这个类必须继承AbstractRoutingDataSource： <br />
<div>代码</div>
<div>
<div>
<div></div>
<ol>
    <li><span><span>package</span><span>&nbsp;cn.com.xinli.ccp.dynamicds; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>import</span><span>&nbsp;org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>public</span><span>&nbsp;</span><span>class</span><span>&nbsp;DynamicDataSource&nbsp;</span><span>extends</span><span>&nbsp;AbstractRoutingDataSource&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>protected</span><span>&nbsp;Object&nbsp;determineCurrentLookupKey()&nbsp;{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub </span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span><span>&nbsp;CustomerContextHolder.getCustomerType(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<br />
这个类实现了determineCurrentLookupKey方法，该方法返回一个Object，一般是返回字符串，也可以是枚举类型。该方法中直接使用了CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。 <br />
四、编写spring的配置文件配置数据源 <br />
<div>代码</div>
<div>
<div>
<div></div>
<ol>
    <li><span><span>&lt;</span><span>bean</span><span>&nbsp;</span><span>id</span><span>=</span><span>"parentDataSource"</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>class</span><span>=</span><span>"org.springframework.jdbc.datasource.DriverManagerDataSource"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"driverClassName"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>value</span><span>&gt;</span><span>COM.ibm.db2.jdbc.net.DB2Driver</span><span>&lt;/</span><span>value</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>property</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"url"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>value</span><span>&gt;</span><span>jdbc:db2:127.0.0.1:TEST</span><span>&lt;/</span><span>value</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>property</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>bean</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>bean</span><span>&nbsp;</span><span>id</span><span>=</span><span>"adminDataSource"</span><span>&nbsp;</span><span>parent</span><span>=</span><span>"parentDataSource"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"username"</span><span>&nbsp;</span><span>value</span><span>=</span><span>"admin"</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"password"</span><span>&nbsp;</span><span>value</span><span>=</span><span>"master997mb"</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>bean</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>bean</span><span>&nbsp;</span><span>id</span><span>=</span><span>"yxhDataSource"</span><span>&nbsp;</span><span>parent</span><span>=</span><span>"parentDataSource"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"username"</span><span>&nbsp;</span><span>value</span><span>=</span><span>"yxh"</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"password"</span><span>&nbsp;</span><span>value</span><span>=</span><span>"yxh"</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>bean</span><span>&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<br />
在这个配置中可以看到首先有个parentDataSource，这个主要配置一些数据源的公用信息，项目中都是链接DB2数据库；adminDataSource和yxhDataSource是根据不同需要配置的个性化信息，但都必须加parent属性，值为parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库，那么parentDataSource就可以不要了，直接配置两个不同的数据源链接就可以了。 <br />
五、编写spring配置文件配置多数据源映射关系 <br />
<div>代码</div>
<div>
<div>
<div></div>
<ol>
    <li><span><span>&lt;</span><span>bean</span><span>&nbsp;</span><span>id</span><span>=</span><span>"dataSource"</span><span>&nbsp;</span><span>class</span><span>=</span><span>"cn.com.xinli.ccp.dynamicds.DynamicDataSource"</span><span>&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"targetDataSources"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>map</span><span>&nbsp;</span><span>key-type</span><span>=</span><span>"<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>entry</span><span>&nbsp;</span><span>key</span><span>=</span><span>"Yxh"</span><span>&nbsp;</span><span>value-ref</span><span>=</span><span>"yxhDataSource"</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>map</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>property</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"defaultTargetDataSource"</span><span>&nbsp;</span><span>ref</span><span>=</span><span>"adminDataSource"</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>bean</span><span>&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<br />
在这个配置中第一个property属性配置目标数据源，&lt;map key-type="<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String"&gt;中的key-type必须要和静态键值对照类DataSourceMap中的值的类型相同；&lt;entry key="Yxh" value-ref="yxhDataSource"/&gt;中key的值必须要和静态键值对照类中的值相同，如果有多个值，可以配置多个&lt;entry&gt;标签。第二个property属性配置默认的数据源。 <br />
六、配置hibernate。 <br />
Hibernate的配置和普通的hibernate、spring结合的配置一样 <br />
<div>代码</div>
<div>
<div>
<div></div>
<ol>
    <li><span><span>&lt;</span><span>bean</span><span>&nbsp;</span><span>id</span><span>=</span><span>"sessionFactory"</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>class</span><span>=</span><span>"org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;!--&nbsp;to&nbsp;override,&nbsp;use&nbsp;the&nbsp;"SpringDatasourceConfig"&nbsp;snippet&nbsp;in&nbsp;your&nbsp;project&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"dataSource"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>ref</span><span>&nbsp;</span><span>local</span><span>=</span><span>"dataSource"</span><span>&nbsp;</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>property</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"mappingResources"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>list</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>value</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn/com/xinli/ccp/entity/User.hbm.xml &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>value</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>value</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn/com/xinli/ccp/entity/Test.hbm.xml &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>value</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>list</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>property</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"hibernateProperties"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>props</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.dialect"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.DB2Dialect &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.show_sql"</span><span>&gt;</span><span>true</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.use_outer_join"</span><span>&gt;</span><span>true</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.jdbc.batch_size"</span><span>&gt;</span><span>50</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.jdbc.fetch_size"</span><span>&gt;</span><span>5</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.connection.pool_size"</span><span>&gt;</span><span>2</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.connection.autocommit"</span><span>&gt;</span><span>false</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.cache.use_query_cache"</span><span>&gt;</span><span>false</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.max_fetch_depth"</span><span>&gt;</span><span>1</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>prop</span><span>&nbsp;</span><span>key</span><span>=</span><span>"hibernate.bytecode.use_reflection_optimizer"</span><span>&gt;</span><span>true</span><span>&lt;/</span><span>prop</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>props</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>property</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>bean</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&lt;</span><span>bean</span><span>&nbsp;</span><span>id</span><span>=</span><span>"mydao"</span><span>&nbsp;</span><span>class</span><span>=</span><span>"cn.com.xinli.ccp.dao.HibernateBaseDao"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>property</span><span>&nbsp;</span><span>name</span><span>=</span><span>"sessionFactory"</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>ref</span><span>&nbsp;</span><span>local</span><span>=</span><span>"sessionFactory"</span><span>&nbsp;</span><span>/&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>property</span><span>&gt;</span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>bean</span><span>&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<br />
关于dao的代码这里就省略了。 <br />
七、配置结束，可以使用了。 <br />
<div>代码</div>
<div>
<div>
<div></div>
<ol>
    <li><span><span>public</span><span>&nbsp;</span><span>class</span><span>&nbsp;DaoTest&nbsp;</span><span>extends</span><span>&nbsp;TestCase&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>void</span><span>&nbsp;testSave()&nbsp;</span><span>throws</span><span>&nbsp;Exception{ &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerContextHolder.setCustomerType(DataSourceMap.Admin);</span><span>//设置数据源 </span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//hibernate创建实体 </span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;test&nbsp;=&nbsp;</span><span>new</span><span>&nbsp;Test(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.setTest(</span><span>"22222222"</span><span>); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mydao.save(test);</span><span>//使用dao保存实体 </span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);</span><span>//设置为另一个数据源 </span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mydao.save(test);</span><span>//使用dao保存实体到另一个库中 </span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
在项目中对于编码人员对多数据源的切换可以做成透明的，操作同样的dao，就可以访问不同的数据库了。<img src ="http://www.blogjava.net/rain1102/aggbug/258670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-03-09 21:06 <a href="http://www.blogjava.net/rain1102/archive/2009/03/09/258670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HQL中使用in查询</title><link>http://www.blogjava.net/rain1102/archive/2009/02/27/256987.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 27 Feb 2009 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/27/256987.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/256987.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/27/256987.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/256987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/256987.html</trackback:ping><description><![CDATA[String hql = " from ACD1Structure structure left join fetch structure.molTable where structure.id in (:ids)";<br />
structures = (List&lt;ACD1Structure&gt;) structureDAO.createQuery(hql).<span style="color: #008000">setParameterList</span>("ids", cd_ids).list();<img src ="http://www.blogjava.net/rain1102/aggbug/256987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-02-27 13:10 <a href="http://www.blogjava.net/rain1102/archive/2009/02/27/256987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的createSQLQuery查询的小例子</title><link>http://www.blogjava.net/rain1102/archive/2009/02/23/256344.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 23 Feb 2009 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/23/256344.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/256344.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/23/256344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/256344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/256344.html</trackback:ping><description><![CDATA[<p>当我们用HQL进行子查询的时候，如select * from Tree where pid in (select id from Tree，此时HIBERANTE就会报错，说什么*号错误之类的。但如果将*改为Tree类里的所有子段时就不会有问题了。就会像平时一样第一行数据返回一个Object[]，然后你再根据Tree类里字段对Object[]数组里的值进行转换。这样一来比较麻烦。今天发现如果我SQL来查有一个方法可以返回一个对象的。 <br />
<span style="color: #008000">Configuration config = new Configuration().configure();<br />
SessionFactory sf&nbsp;&nbsp;&nbsp;&nbsp; = config.buildSessionFactory();<br />
Session session = sf.openSession();<br />
Transaction ts = session.beginTransaction();<br />
Query query = session.createSQLQuery("select * from Tree t where pid in (select id from Tree) ").addEntity(Tree.class); <span style="color: #ff0000">//</span><span style="color: #ff0000">返回对象<br />
</span>List&nbsp; list = query.list();&nbsp; </span></p>
<p>此时在遍历list时就可以(Tree)list.get[i];将每一行的内容变换为一个对象了。 </p>
<p>另还可以返回一个Map对象，也就是说在在list里包含多个Map，代码如下 <br />
<span style="color: #008000">Query query = session.createSQLQuery("select id,name from Tree t where pid in (select id from Tree) ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP</span><span style="color: #008000">); <span style="color: #ff0000">//返回一个map,KEY:为DB中名称一致（大小写一致）</span></span>遍历list时就可以 </p>
<p>Map map = (Map)list.get[i]; </p>
<p>map.get("id");map.get("name");来取值。按你的SQL语句select后的字段名来作为map的Key，但这个key必须与数据库中的字段名一模一样。 </p>
<p><br />
还可以用作函数方面的。如 <br />
<span style="color: #008000">Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in (select id from Tree)<br />
.addScalar("SUMID",Hibernate.INTEGER)&nbsp; <span style="color: #ff0000">//转换类型，按DB中的type转<br />
</span>.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); <span style="color: #ff0000">//返回一个map,KEY:为DB中名称一致（大小写一致）</span></span></p>
<p>直接就map.get("SUMID")可以取值了 </p>
<p><br />
还有一点就是这个方法在Hibernate3.2版本上才能正常运行。 </p><img src ="http://www.blogjava.net/rain1102/aggbug/256344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-02-23 21:26 <a href="http://www.blogjava.net/rain1102/archive/2009/02/23/256344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Annotation中BLOB、CLOB注解写法</title><link>http://www.blogjava.net/rain1102/archive/2009/02/10/254102.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 10 Feb 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/10/254102.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/254102.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/10/254102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/254102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/254102.html</trackback:ping><description><![CDATA[&nbsp; <span style="font-family: 宋体">在</span>hibernate Annotation<span style="font-family: 宋体">中，实体</span>BLOB<span style="font-family: 宋体">、</span>CLOB<span style="font-family: 宋体">类型的注解与普通的实体属性有些不同，具体操作如下：</span>BLOB<span style="font-family: 宋体">类型，类型声明为</span>byte[]<span style="font-family: 宋体">：</span>
<table style="width: 367.5pt" cellspacing="0" cellpadding="0" width="490" align="left" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 4.5pt; padding-left: 4.5pt; background: #f3f3f3; padding-bottom: 4.5pt; padding-top: 4.5pt; word-wrap: break-word">
            <p>private byte[] content<span style="font-family: 宋体">；</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; <br />
<br />
<span style="font-family: 宋体"><br />
注解：</span></p>
<table style="width: 367.5pt" cellspacing="0" cellpadding="0" width="490" align="left" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 4.5pt; padding-left: 4.5pt; background: #f3f3f3; padding-bottom: 4.5pt; padding-top: 4.5pt; word-wrap: break-word">
            <p>@Lob <br />
            @Basic(fetch = FetchType.LAZY) <br />
            @Column(name = "CONTENT", columnDefinition = "BLOB",nullable=true) <br />
            public byte[] getContent() {&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return this.content; <br />
            } <br />
            <br />
            public void setContent(byte[] content) {&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;this.content = content; <br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CLOB<span style="font-family: 宋体">类型，类型声明为</span>String<span style="font-family: 宋体">即可：</span></p>
<table style="width: 366.75pt" cellspacing="0" cellpadding="0" width="489" align="left" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 4.5pt; padding-left: 4.5pt; background: #f3f3f3; padding-bottom: 4.5pt; padding-top: 4.5pt; word-wrap: break-word">
            <p>private String remark<span style="font-family: 宋体">；</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp; <br />
<br />
<span style="font-family: 宋体"><br />
注解：</span></p>
<table style="width: 367.5pt" cellspacing="0" cellpadding="0" width="490" align="left" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 4.5pt; padding-left: 4.5pt; background: #f3f3f3; padding-bottom: 4.5pt; padding-top: 4.5pt; word-wrap: break-word">
            <p>@Lob <br />
            @Basic(fetch = FetchType.EAGER) <br />
            @Column(name="REMARK", columnDefinition="CLOB", nullable=true) <br />
            public String getRemark() {&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;return this.remark; <br />
            } <br />
            <br />
            public void setRemark(String recvdocRemark) {&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;this.remark = remark; <br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/254102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-02-10 16:24 <a href="http://www.blogjava.net/rain1102/archive/2009/02/10/254102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 常用 JPA annotation 参考</title><link>http://www.blogjava.net/rain1102/archive/2009/02/09/253913.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 09 Feb 2009 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/02/09/253913.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/253913.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/02/09/253913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/253913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/253913.html</trackback:ping><description><![CDATA[<p><strong>Table <br />
</strong>Table用来定义entity主表的name，catalog，schema等属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;name: 表名 <br />
&#183;&nbsp;catalog: 对应关系数据库中的catalog <br />
&#183;&nbsp;schema：对应关系数据库中的schema <br />
&#183;&nbsp;UniqueConstraints:定义一个UniqueConstraint数组，指定需要建唯一约束的列 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="CUST")<br />
public class Customer { ... }<br />
　　<br />
<strong>SecondaryTable</strong> <br />
一个entity class可以映射到多表，SecondaryTable用来定义单个从表的名字，主键名字等属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;name: 表名 <br />
&#183;&nbsp;catalog: 对应关系数据库中的catalog <br />
&#183;&nbsp;schema：对应关系数据库中的schema <br />
&#183;&nbsp;pkJoin: 定义一个PrimaryKeyJoinColumn数组，指定从表的主键列 <br />
&#183;&nbsp;UniqueConstraints:定义一个UniqueConstraint数组，指定需要建唯一约束的列 <br />
下面的代码说明Customer类映射到两个表，主表名是CUSTOMER，从表名是CUST_DETAIL，从表的主键列和主表的主键列类型相同，列名为CUST_ID。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="CUSTOMER")<br />
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))<br />
public class Customer { ... }</p>
<p><strong>SecondaryTables </strong><br />
当一个entity class映射到一个主表和多个从表时，用SecondaryTables来定义各个从表的属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;value： 定义一个SecondaryTable数组，指定每个从表的属性。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Table(name = "CUSTOMER")<br />
@SecondaryTables( value = {<br />
@SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),<br />
@SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })<br />
public class Customer {}</p>
<p>UniqueConstraint <br />
UniqueConstraint定义在Table或SecondaryTable元数据里，用来指定建表时需要建唯一约束的列。 <br />
元数据属性说明： <br />
&#183;&nbsp;columnNames:定义一个字符串数组，指定要建唯一约束的列名。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="EMPLOYEE",<br />
uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}<br />
)<br />
public class Employee { ... }</p>
<p><strong>Column <br />
</strong>Column元数据定义了映射到数据库的列的所有属性：列名，是否唯一，是否允许为空，是否允许更新等。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:列名。 <br />
&#183;&nbsp;unique: 是否唯一 <br />
&#183;&nbsp;nullable: 是否允许为空 <br />
&#183;&nbsp;insertable: 是否允许插入 <br />
&#183;&nbsp;updatable: 是否允许更新 <br />
&#183;&nbsp;columnDefinition: 定义建表时创建此列的DDL <br />
&#183;&nbsp;secondaryTable: 从表名。如果此列不建在主表上（默认建在主表），该属性定义该列所在从表的名字。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
public class Person {<br />
@Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)<br />
private String name;<br />
@Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")<br />
private byte[] picture;</p>
<p><strong>JoinColumn <br />
</strong>如果在entity class的field上定义了关系（one2one或one2many等），我们通过JoinColumn来定义关系的属性。JoinColumn的大部分属性和Column类似。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:列名。 <br />
&#183;&nbsp;referencedColumnName:该列指向列的列名（建表时该列作为外键列指向关系另一端的指定列） <br />
&#183;&nbsp;unique: 是否唯一 <br />
&#183;&nbsp;nullable: 是否允许为空 <br />
&#183;&nbsp;insertable: 是否允许插入 <br />
&#183;&nbsp;updatable: 是否允许更新 <br />
&#183;&nbsp;columnDefinition: 定义建表时创建此列的DDL <br />
&#183;&nbsp;secondaryTable: 从表名。如果此列不建在主表上（默认建在主表），该属性定义该列所在从表的名字。 <br />
下面的代码说明Custom和Order是一对一关系。在Order对应的映射表建一个名为CUST_ID的列，该列作为外键指向Custom对应表中名为ID的列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
public class Custom {<br />
@OneToOne<br />
@JoinColumn(<br />
name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)<br />
public Order getOrder() {<br />
return order;<br />
}</p>
<p><strong>JoinColumns</strong> <br />
如果在entity class的field上定义了关系（one2one或one2many等），并且关系存在多个JoinColumn，用JoinColumns定义多个JoinColumn的属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: 定义JoinColumn数组，指定每个JoinColumn的属性。 <br />
下面的代码说明Custom和Order是一对一关系。在Order对应的映射表建两列，一列名为CUST_ID，该列作为外键指向Custom对应表中名为ID的列,另一列名为CUST_NAME，该列作为外键指向Custom对应表中名为NAME的列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
public class Custom {<br />
@OneToOne<br />
@JoinColumns({<br />
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br />
@JoinColumn(name="CUST_NAME", referencedColumnName="NAME")<br />
})<br />
public Order getOrder() {<br />
return order;<br />
}</p>
<p><strong>Id </strong><br />
声明当前field为映射表中的主键列。id值的获取方式有五种：TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCE，SQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的数据库都可以指定为AUTO，我们会根据不同数据库做转换。NONE (默认)需要用户自己指定Id的值。元数据属性说明： <br />
&#183;&nbsp;generate():主键值的获取类型 <br />
&#183;&nbsp;generator():TableGenerator的名字（当generate=GeneratorType.TABLE才需要指定该属性） <br />
下面的代码声明Task的主键列id是自动增长的。(Oracle和DB2从默认的SEQUENCE取值，SQL Server和Sybase该列建成IDENTITY，mysql该列建成auto increment。) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name = "OTASK")<br />
public class Task {<br />
@Id(generate = GeneratorType.AUTO)<br />
public Integer getId() {<br />
return id;<br />
}<br />
}</p>
<p><strong>IdClass</strong> <br />
当entity class使用复合主键时，需要定义一个类作为id class。id class必须符合以下要求:类必须声明为public，并提供一个声明为public的空构造函数。必须实现Serializable接，覆写 equals()和hashCode（）方法。entity class的所有id field在id class都要定义，且类型一样。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: id class的类名 <br />
&nbsp;&nbsp; public class EmployeePK implements <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.io.Serializable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String empName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer empAge;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public EmployeePK(){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean equals(Object obj){ ......}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int hashCode(){......}<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @IdClass(value=com.acme.EmployeePK.class)<br />
&nbsp;&nbsp;&nbsp; @Entity(access=FIELD)<br />
&nbsp;&nbsp;&nbsp; public class Employee {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Id String empName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Id Integer empAge;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<strong>MapKey</strong> <br />
在一对多，多对多关系中，我们可以用Map来保存集合对象。默认用主键值做key，如果使用复合主键，则用id class的实例做key，如果指定了name属性，就用指定的field的值做key。 <br />
元数据属性说明： <br />
&#183;&nbsp;name: 用来做key的field名字 <br />
下面的代码说明Person和Book之间是一对多关系。Person的books字段是Map类型，用Book的isbn字段的值作为Map的key。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>@Table(name = "PERSON")<br />
public class Person {<br />
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br />
@MapKey(name = "isbn")<br />
private Map books = new HashMap();<br />
}</p>
<p><br />
<strong>OrderBy <br />
</strong>在一对多，多对多关系中，有时我们希望从数据库加载出来的集合对象是按一定方式排序的，这可以通过OrderBy来实现，默认是按对象的主键升序排列。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: 字符串类型，指定排序方式。格式为"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序类型可以不指定，默认是ASC。 <br />
下面的代码说明Person和Book之间是一对多关系。集合books按照Book的isbn升序，name降序排列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>@Table(name = "MAPKEY_PERSON")<br />
public class Person {<br />
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br />
@OrderBy(name = "isbn ASC, name DESC")<br />
private List books = new ArrayList();<br />
}</p>
<p><br />
<strong>PrimaryKeyJoinColumn</strong> <br />
在三种情况下会用到PrimaryKeyJoinColumn。 <br />
&#183;&nbsp;继承。 <br />
&#183;&nbsp;entity class映射到一个或多个从表。从表根据主表的主键列（列名为referencedColumnName值的列），建立一个类型一样的主键列，列名由name属性定义。 <br />
&#183;&nbsp;one2one关系，关系维护端的主键作为外键指向关系被维护端的主键，不再新建一个外键列。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:列名。 <br />
&#183;&nbsp;referencedColumnName:该列引用列的列名 <br />
&#183;&nbsp;columnDefinition: 定义建表时创建此列的DDL <br />
下面的代码说明Customer映射到两个表，主表CUSTOMER,从表CUST_DETAIL，从表需要建立主键列CUST_ID，该列和主表的主键列id除了列名不同，其他定义一样。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
@Table(name="CUSTOMER")<br />
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"，referencedColumnName="id"))<br />
public class Customer {<br />
@Id(generate = GeneratorType.AUTO)<br />
public Integer getId() {<br />
return id;<br />
}<br />
}</p>
<p>下面的代码说明Employee和EmployeeInfo是一对一关系，Employee的主键列id作为外键指向EmployeeInfo的主键列INFO_ID。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Table(name = "Employee")<br />
public class Employee {<br />
@OneToOne<br />
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")<br />
EmployeeInfo info;<br />
}</p>
<p><strong>PrimaryKeyJoinColumns</strong> <br />
如果entity class使用了复合主键，指定单个PrimaryKeyJoinColumn不能满足要求时，可以用PrimaryKeyJoinColumns来定义多个PrimaryKeyJoinColumn。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: 一个PrimaryKeyJoinColumn数组，包含所有PrimaryKeyJoinColumn。 <br />
下面的代码说明了Employee和EmployeeInfo是一对一关系。他们都使用复合主键，建表时需要在Employee表建立一个外键，从Employee的主键列id,name指向EmployeeInfo的主键列INFO_ID和INFO_NAME. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@IdClass(EmpPK.class)<br />
@Table(name = "EMPLOYEE")<br />
public class Employee {<br />
private int id;<br />
private String name;<br />
private String address;<br />
@OneToOne(cascade = CascadeType.ALL)<br />
@PrimaryKeyJoinColumns({<br />
@PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),<br />
@PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})<br />
EmployeeInfo info;<br />
}<br />
@Entity<br />
@IdClass(EmpPK.class)<br />
@Table(name = "EMPLOYEE_INFO")<br />
public class EmployeeInfo {<br />
@Id<br />
@Column(name = "INFO_ID")<br />
private int id;<br />
@Id<br />
@Column(name = "INFO_NAME")<br />
private String name;<br />
}</p>
<p><strong>Transient <br />
</strong>Transient用来注释entity的属性，指定的这些属性不会被持久化，也不会为这些属性建表。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Transient<br />
private String name;</p>
<p><strong>Version </strong><br />
Version指定实体类在乐观事务中的version属性。在实体类重新由EntityManager管理并且加入到乐观事务中时，保证完整性。每一个类只能有一个属性被指定为version，version属性应该映射到实体类的主表上。 <br />
下面的代码说明versionNum属性作为这个类的version，映射到数据库中主表的列名是OPTLOCK。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Version<br />
@Column("OPTLOCK")<br />
protected int getVersionNum() { return versionNum; }</p>
<p><strong>Lob</strong> <br />
Lob指定一个属性作为数据库支持的大对象类型在数据库中存储。使用LobType这个枚举来定义Lob是二进制类型还是字符类型。 <br />
LobType枚举类型说明： <br />
&#183;&nbsp;BLOB 二进制大对象，Byte[]或者Serializable的类型可以指定为BLOB。 <br />
&#183;&nbsp;CLOB 字符型大对象，char[]、Character[]或String类型可以指定为CLOB。 <br />
元数据属性说明： <br />
&#183;&nbsp;fetch： 定义这个字段是lazy loaded还是eagerly fetched。数据类型是FetchType枚举，默认为LAZY,即lazy loaded. <br />
&#183;&nbsp;type： 定义这个字段在数据库中的JDBC数据类型。数据类型是LobType枚举，默认为BLOB。 <br />
下面的代码定义了一个BLOB类型的属性和一个CLOB类型的属性。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Lob<br />
@Column(name="PHOTO" columnDefinition="BLOB NOT NULL")<br />
protected JPEGImage picture;<br />
@Lob(fetch=EAGER, type=CLOB)<br />
@Column(name="REPORT")<br />
protected String report;</p>
<p><strong>JoinTable</strong> <br />
JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTable，使用JoinTable的默认值。 <br />
元数据属性说明： <br />
&#183;&nbsp;table:这个join table的Table定义。 <br />
&#183;&nbsp;joinColumns:定义指向所有者主表的外键列，数据类型是JoinColumn数组。 <br />
&#183;&nbsp;inverseJoinColumns:定义指向非所有者主表的外键列，数据类型是JoinColumn数组。 <br />
下面的代码定义了一个连接表CUST和PHONE的join table。join table的表名是CUST_PHONE，包含两个外键，一个外键是CUST_ID，指向表CUST的主键ID，另一个外键是PHONE_ID，指向表PHONE的主键ID。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@JoinTable(<br />
table=@Table(name=CUST_PHONE),<br />
joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br />
inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")<br />
)</p>
<p><strong>TableGenerator</strong> <br />
TableGenerator定义一个主键值生成器，在Id这个元数据的generate＝TABLE时，generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。 <br />
生成器是为多个实体类提供连续的ID值的表，每一行为一个类提供ID值，ID值通常是整数。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:生成器的唯一名字，可以被Id元数据使用。 <br />
&#183;&nbsp;table:生成器用来存储id值的Table定义。 <br />
&#183;&nbsp;pkColumnName:生成器表的主键名称。 <br />
&#183;&nbsp;valueColumnName:生成器表的ID值的列名称。 <br />
&#183;&nbsp;pkColumnValue:生成器表中的一行数据的主键值。 <br />
&#183;&nbsp;initialValue:id值的初始值。 <br />
&#183;&nbsp;allocationSize:id值的增量。 <br />
下面的代码定义了两个生成器empGen和addressGen，生成器的表是ID_GEN。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity public class Employee {<br />
...<br />
@TableGenerator(name="empGen",<br />
table=@Table(name="ID_GEN"),<br />
pkColumnName="GEN_KEY",<br />
valueColumnName="GEN_VALUE",<br />
pkColumnValue="EMP_ID",<br />
allocationSize=1)<br />
@Id(generate=TABLE, generator="empGen")<br />
public int id;<br />
...<br />
}<br />
@Entity public class Address {<br />
...<br />
@TableGenerator(name="addressGen",<br />
table=@Table(name="ID_GEN"),<br />
pkColumnValue="ADDR_ID")<br />
@Id(generate=TABLE, generator="addressGen")<br />
public int id;<br />
...<br />
}</p>
<p><strong>SequenceGenerator</strong> <br />
SequenceGenerator定义一个主键值生成器，在Id这个元数据的generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。生成器是数据库支持的sequence对象。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:生成器的唯一名字，可以被Id元数据使用。 <br />
&#183;&nbsp;sequenceName:数据库中，sequence对象的名称。如果不指定，会使用提供商指定的默认名称。 <br />
&#183;&nbsp;initialValue:id值的初始值。 <br />
&#183;&nbsp;allocationSize:id值的增量。 <br />
下面的代码定义了一个使用提供商默认名称的sequence生成器。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@SequenceGenerator(name="EMP_SEQ", allocationSize=25)</p>
<p><strong>DiscriminatorColumn </strong><br />
DiscriminatorColumn定义在使用SINGLE_TABLE或JOINED继承策略的表中区别不继承层次的列。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:column的名字。默认值为TYPE。 <br />
&#183;&nbsp;columnDefinition:生成DDL的sql片断。 <br />
&#183;&nbsp;length:String类型的column的长度，其他类型使用默认值10。 <br />
下面的代码定义了一个列名为DISC，长度为20的String类型的区别列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="CUST")<br />
@Inheritance(strategy=SINGLE_TABLE,<br />
discriminatorType=STRING,<br />
discriminatorValue="CUSTOMER")<br />
@DiscriminatorColumn(name="DISC", length=20)<br />
public class Customer { ... }</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/rain1102/aggbug/253913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-02-09 15:38 <a href="http://www.blogjava.net/rain1102/archive/2009/02/09/253913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EQL中使用case when..then..else..end和exists语句, 以及True和False</title><link>http://www.blogjava.net/rain1102/archive/2008/08/29/225667.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 29 Aug 2008 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/08/29/225667.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/225667.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/08/29/225667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/225667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/225667.html</trackback:ping><description><![CDATA[public List&lt;Meeting&gt; getRecentlyMeetingsByAudit(Long candidateId, Long ownerId) {<br />
&nbsp;&nbsp;&nbsp; List&lt;Meeting&gt; meetings = new ArrayList&lt;Meeting&gt;();<br />
&nbsp;&nbsp; &nbsp;meetings = mgr.createQuery("select new com.integral7.ejb3.investigations.Meeting(m.id, m.scheduledDate, m.type.name, m.description, " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<span style="color: red"><span style="color: #800080"><strong>case when</strong> </span><span style="color: #0000ff"><strong>exists</strong></span>(select id from MeetingAudit ma where ma.meeting = m and ma.audit.id = ?0) <span style="color: #800080"><strong>then</strong> </span><span style="color: #008000"><strong>True</strong></span> <span style="color: #800080"><strong>else </strong></span><span style="color: #008000"><strong>False</strong> </span><span style="color: #800080"><strong>end</strong></span></span>) " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " from Meeting m " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " where m.owner.id = ?1 and m.scheduledDate &gt;= ?2 order by m.scheduledDate asc")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setParameter(0, candidateId)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setParameter(1, ownerId)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setParameter(2, DateUtils.convertToBeginningOfDay(new Date())).getResultList();<br />
&nbsp;&nbsp; &nbsp;return meetings;<br />
&nbsp;}<br />
<br />
这里主要注意<span style="color: #008000">True</span> 和<span style="color: #008000">False </span>首字母必须大写其余小写.<img src ="http://www.blogjava.net/rain1102/aggbug/225667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-08-29 23:38 <a href="http://www.blogjava.net/rain1102/archive/2008/08/29/225667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HQL语句中的数据类型转换</title><link>http://www.blogjava.net/rain1102/archive/2008/07/22/216579.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 22 Jul 2008 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/22/216579.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/216579.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/22/216579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/216579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/216579.html</trackback:ping><description><![CDATA[<p>比如我数据库里面使用varchar和对象是使用字符串类型, 而实际里面的值都是整数, 这样需要按照数值来排序, 因为如果按照字符串排序104会在<a title="Edit Case" href="http://127.0.0.1:8080/durango/do/investigations/caseentitydisplay?caseEntityId=1863214303&amp;from=candidate&amp;3D6CBF60ADAE3C6C0D8E570165AD529C=4FEAB1F2AB46BB808D030348C0F03895&amp;ownername=boc&amp;basechannel=boc&amp;channel=boc&amp;usertype=admin+%7D+%7D+%7D+%7D+%7D">&nbsp;</a>1020后面.<br />
使用cast(ce.caseID as long) 或者cast(ce.caseID as integer) 这要看你的需要了. <br />
<span style="color: red"><span style="color: red">注意:long和integer的首字母要小写. 不然会报空指针异常.</span></span></p><img src ="http://www.blogjava.net/rain1102/aggbug/216579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-22 13:26 <a href="http://www.blogjava.net/rain1102/archive/2008/07/22/216579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于hibernate3中enum类型的数据持久化问题</title><link>http://www.blogjava.net/rain1102/archive/2008/07/01/211915.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 01 Jul 2008 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/01/211915.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/211915.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/01/211915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/211915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/211915.html</trackback:ping><description><![CDATA[<div class="blog_content">
<pre>对需要解决的问题的描述：<br />
把一个<span class="hilite2">enum类型</span>的字段持久化到数据库中，写入到数据库中的值为Integer类型，且有特定的含义：<br />
<br />
我们知道，如果我们某一个pojo对象的某个属性为<span class="hilite2">enum类型</span>的话，在持久化的时候可能会出现如下两种情况:<br />
1、数据库中enum_col的类型为(oracle:number或者sql server:numeric)<br />
&nbsp;&nbsp; @Column(name="enum_col")<br />
&nbsp;&nbsp; public MyEnum getCol(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.col;<br />
&nbsp;&nbsp; }<br />
此种情况下，存到数据库中的数据时col.ordinal()所返回的int数值<br />
2、数据库中enum_col的类型为(oracle:varchar2,或者sql server：varchar)<br />
&nbsp;&nbsp; @Column(name="enum_col")<br />
&nbsp;&nbsp; public MyEnum getCol(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.col;<br />
&nbsp;&nbsp; }<br />
此种情况下，存储到数据库中的值为定义此enum是所使用的名字如：<br />
&nbsp;&nbsp; public enum MyEnum{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATA1,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATA2;<br />
&nbsp;&nbsp; }<br />
则，如果this.col代表DATA1则写DATA1到数据库中去。</pre>
<pre>那么我们通过什么样的手段来改变这些呢？如果使用的是hibernate的话可以借助于UserType来实现：<br />
首先、定义一个enum MyEnumData，(在持久化的时候把其code写到数据库中去)<br />
package ec.snow.hib.pojos;<br />
public enum MyEnumData{<br />
&nbsp;&nbsp; DATA1("data1",100),<br />
&nbsp;&nbsp; DATA2("data2",200),<br />
&nbsp;&nbsp; DATA3("data3",300);</pre>
<pre>&nbsp;&nbsp; private String name;<br />
&nbsp;&nbsp; private int code;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; public int getCode(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.code;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public String getName(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.name;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; MyEnumData(String name,int code){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.code = code;<br />
&nbsp;&nbsp; }<br />
//辅助方法，主要在UserType的实现中通过相应的code得到MyEnumData<br />
<br />
public static MyEnumData formCode(int code){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(MyEnumData u:MyEnumData.values()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(u.getCode()==code)return u;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp; }<br />
}</pre>
<pre>//*******************************<br />
接下来、定义相应的UserType的实现：<br />
package com.snow.hib.pojos;</pre>
<pre>import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>.io.Serializable;<br />
import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>.sql.PreparedStatement;<br />
import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>.sql.ResultSet;<br />
import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>.sql.SQLException;<br />
import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>.sql.Types;</pre>
<pre>import org.hibernate.HibernateException;<br />
import org.hibernate.usertype.UserType;</pre>
<pre>/**<br />
&nbsp;*@author anwx<a href="http://anweixiao.javaeye.com/blog/anwx@chsi.com.cn">An Weixiao</a><br />
&nbsp;*@version $Id$<br />
&nbsp;*/<br />
public class MyEnumDataType implements UserType {<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int[] sqlTypes() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] types = {Types.INTEGER};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return types;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Class returnedClass(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return UserTitle.class;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public boolean equals(Object x, Object y) throws HibernateException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x == y;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int hashCode(Object x) throws HibernateException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x.hashCode();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object nullSafeGet(ResultSet rs, String[] names, Object owner)<br />
throws HibernateException, SQLException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int code = rs.getInt(names[0]);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs.wasNull() ? null : MyEnumData.formCode(code);//notice code to use&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void nullSafeSet(PreparedStatement st, Object value, int index) <br />
throws HibernateException, SQLException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value == null) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.setNull(index, Types.INTEGER);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st.setInt(index, ((MyEnumData) value).getCode());&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object deepCopy(Object value) throws HibernateException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public boolean isMutable() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Serializable disassemble(Object value) throws HibernateException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Serializable) deepCopy(value);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object assemble(Serializable cached, Object owner) throws HibernateException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return deepCopy(cached);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object replace(Object original, Object target, Object owner) <br />
throws HibernateException {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return deepCopy(original);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
} </pre>
<pre>//**********************************<br />
最后、通过自定义的UserType来实现对enum的有效持久化<br />
package com.snow.hib.pojos;</pre>
<pre>import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>.io.Serializable;</pre>
<pre>import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>x.persistence.Column;<br />
import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>x.persistence.Entity;<br />
import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>x.persistence.Id;<br />
import <span class="hilite1"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a></span>x.persistence.Table;</pre>
<pre>import org.hibernate.annotations.Type;</pre>
<pre>/**<br />
&nbsp;*@author anwx<a href="http://anweixiao.javaeye.com/blog/anwx@chsi.com.cn">An Weixiao</a><br />
&nbsp;*@version<br />
&nbsp;*/<br />
@Entity<br />
@Table(name="my_def_type")<br />
public class UseMyEnumData implements Serializable{&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = 6905822670746966787L;<br />
&nbsp;&nbsp;&nbsp; private String id;<br />
&nbsp;&nbsp;&nbsp; private String username;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private MyEnumData enumData;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; @Column(updatable = true,nullable = true,name="MY_TITLE")<br />
&nbsp;&nbsp;&nbsp; @Type(type="com.snow.hib.pojos.MyEnumDataType")<br />
&nbsp;&nbsp;&nbsp; public MyEnumData getEnumData() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return enumData;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setEnumData(MyEnumData data) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.enumData = data;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; @Column(updatable=true,nullable = true,name="USER_NAME")<br />
&nbsp;&nbsp;&nbsp; public String getUsername() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return username;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setUsername(String username) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.username = username;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }</pre>
<pre>&nbsp;/**<br />
&nbsp; * @return Returns the id.<br />
&nbsp; */<br />
&nbsp;&nbsp;&nbsp; @Id<br />
&nbsp;public String getId() {<br />
&nbsp;&nbsp;return id;<br />
&nbsp;}</pre>
<pre>&nbsp;/**<br />
&nbsp; * @param id The id to set.<br />
&nbsp; */<br />
&nbsp;public void setId(String id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}&nbsp;&nbsp;&nbsp; <br />
} <br />
下面是测试结果：<br />
//***************************Test result<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UseMyEnumData data = new UseMyEnumData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setId("123456");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setTitle(MyEnumData.DATA1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.setUsername("chsi:manager");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager.saveUseMyEnumData(title);<br />
则数据库中写入的数据为： [123456 100 chsi:manager] <br />
<br />
<br />
还有一点需要注意的是，如果系统中用来影射<span class="hilite2">enum类型</span>的数据可能有出现空值的时候hibernate在处理影射的时候会<br />
把<span class="hilite2">Enum类型</span>影射为null,也就是没有对应的数据，这在处理旧有系统数据的时候会有用处哦&#8230;&#8230;&#8230;&#8230;</pre>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/211915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-01 15:26 <a href="http://www.blogjava.net/rain1102/archive/2008/07/01/211915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置Entity beans为缓存</title><link>http://www.blogjava.net/rain1102/archive/2008/06/13/207622.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 13 Jun 2008 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/06/13/207622.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/207622.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/06/13/207622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/207622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/207622.html</trackback:ping><description><![CDATA[<div><span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>
<div><span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>你用正常方式定义你的 entity bean 类。JBoss EJB 3.0 将来的版本将支持 annotating entities 和所缓存的它们的关系的集合，但是现在你不得不直接配置底层的 hibernate 引擎。让我们看看通过可选的property元素配置 hibernate 缓存选项的persistence.xml文件。下面persistence.xml 里的定义缓存的元素应该被启用：</span></div>
<span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee">&lt;!--<font color="#008000"> Clustered cache with TreeCache </font>--&gt; <br />
<font color="#0000ff">&lt;</font><font color="#800000">property</font> <font color="#ff0000">name</font><font color="#0000ff">="cache.provider_class"</font><font color="#0000ff">&gt;</font> <br />
org.jboss.ejb3.entity.TreeCacheProviderHook <br />
<font color="#0000ff">&lt;/</font><font color="#800000">property</font><font color="#0000ff">&gt;</font></div>
</div>
<div>&nbsp;</div>
<div><span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>下面的属性元素定义了所使用的缓存对象名和 MBean 名。</span></div>
<span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee"><font color="#0000ff">&lt;</font><font color="#800000">property</font> <font color="#ff0000">name</font><font color="#0000ff">="treecache.mbean.object_name"</font><font color="#0000ff">&gt;</font> <br />
jboss.cache:service=EJB3EntityTreeCache <br />
<font color="#0000ff">&lt;/</font><font color="#800000">property</font><font color="#0000ff">&gt;</font></div>
</div>
<div>&nbsp;</div>
<div><span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>下一步我们需要配置 entities 被缓存的内容。就像上面所展示的样，缺省是什么都不缓存。我们使用@Cache 注解来标记需要缓存的 entity beans。</span></div>
<span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee">@Entity <br />
@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL) <br />
<font color="#0000ff">public</font> <font color="#0000ff">class</font> Customer <font color="#0000ff">implements</font> Serializable { <br />
<font color="#008000">// ... ... </font><br />
}</div>
</div>
<div>&nbsp;</div>
<div><span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>&nbsp;&nbsp;&nbsp; 一个简单的原则就是，你应该对很少变动和频繁使用的对象进行缓存.你可以在ejb3-entity-cache-service.xml配置文件里为每个 entity bean 微调缓存设置。例如，你可以指定缓存的大小。如果缓存里的对象太多，缓存有可能挤掉最老的对象（或者最少用的对象，依你的配置而定）来给新对象留出空间。mycompany.Customer entity bean 的缓存区（cache region）是/mycompany/Customer。</span></div>
<span style="font-size: 10.5pt; font-family: 宋体"  AR-SA New Times .5pt;>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee"><font color="#0000ff">&lt;</font><font color="#800000">server</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">mbean</font> <font color="#ff0000">code</font><font color="#0000ff">="org.jboss.cache.TreeCache"</font> <br />
<font color="#ff0000">name</font><font color="#0000ff">="jboss.cache:service=EJB3EntityTreeCache"</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">depends</font><font color="#0000ff">&gt;</font>jboss:service=Naming <br />
<font color="#0000ff">&lt;</font><font color="#800000">depends</font><font color="#0000ff">&gt;</font>jboss:service=TransactionManager <br />
... ... <br />
<font color="#0000ff">&lt;</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="EvictionPolicyConfig"</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">config</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="wakeUpIntervalSeconds"</font><font color="#0000ff">&gt;</font>5<font color="#0000ff">&lt;/</font><font color="#800000">attribute</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">region</font> <font color="#ff0000">name</font><font color="#0000ff">="/_default_"</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="maxNodes"</font><font color="#0000ff">&gt;</font>5000<font color="#0000ff">&lt;/</font><font color="#800000">attribute</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="timeToLiveSeconds"</font><font color="#0000ff">&gt;</font>1000<font color="#0000ff">&lt;/</font><font color="#800000">attribute</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;/</font><font color="#800000">region</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">region</font> <font color="#ff0000">name</font><font color="#0000ff">="/mycompany/Customer"</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="maxNodes"</font><font color="#0000ff">&gt;</font>10<font color="#0000ff">&lt;/</font><font color="#800000">attribute</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="timeToLiveSeconds"</font><font color="#0000ff">&gt;</font>5000<font color="#0000ff">&lt;/</font><font color="#800000">attribute</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;/</font><font color="#800000">region</font><font color="#0000ff">&gt;</font> <br />
... ... <br />
<font color="#0000ff">&lt;/</font><font color="#800000">config</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;/</font><font color="#800000">attribute</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;/</font><font color="#800000">mbean</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;/</font><font color="#800000">server</font><font color="#0000ff">&gt;</font></div>
</div>
</span></span></span></span>
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体"><font style="font-size: 10pt" size="3">如果你没有为 entity bean 类指定缓存区（cache region），这个类的所有实例将象上面定义的一样缓存在/_default区里。EJB3 Query API 提供了让你在指定的缓存区里保存或载入查询结果（就是 entity beans 的集合）的方法。</font></span></span></div>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/207622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-06-13 11:55 <a href="http://www.blogjava.net/rain1102/archive/2008/06/13/207622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3执行SQL语句</title><link>http://www.blogjava.net/rain1102/archive/2008/03/28/189371.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 28 Mar 2008 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/03/28/189371.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/189371.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/03/28/189371.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/189371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/189371.html</trackback:ping><description><![CDATA[当想通过hibernate进行批量增加记录的时候，或者到数据的时候会用到SQL语句。处理如下：<br />
public Integer batchSave(final String sql){<br />
&nbsp;&nbsp;Session session = this.getSession();<br />
&nbsp;&nbsp;Transaction tx = session.beginTransaction();<br />
&nbsp;&nbsp;Integer result = -1;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;<span style="color: #008000">&nbsp;tx.begin();<br />
</span>&nbsp;&nbsp;&nbsp;result = <span style="color: #008000">session.createSQLQuery(sql).executeUpdate();<br />
</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000">session.flush();<br />
&nbsp;&nbsp;&nbsp;tx.commit();<br />
</span>&nbsp;&nbsp;} catch (DataAccessException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;if (tx != null) {<br />
&nbsp;&nbsp;&nbsp;<span style="color: #008000">&nbsp;tx.rollback();<br />
</span>&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} finally {<br />
&nbsp;&nbsp;<span style="color: #008000">&nbsp;session.close();<br />
</span>&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}<img src ="http://www.blogjava.net/rain1102/aggbug/189371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-03-28 23:13 <a href="http://www.blogjava.net/rain1102/archive/2008/03/28/189371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3 错误： could not initialize proxy - no Session </title><link>http://www.blogjava.net/rain1102/archive/2008/02/28/182707.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 28 Feb 2008 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/02/28/182707.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/182707.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/02/28/182707.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/182707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/182707.html</trackback:ping><description><![CDATA[<font size="2">异常：<br />
<font size="2"><font size="2"><font size="2">org.hibernate.LazyInitializationException: <span style="color: #800000"><span style="color: #ff0000">could not initialize proxy - no Session<br />
</span></span>at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)<br />
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111</font></font><font size="2">)<br />
<br />
<span><font face="Times New Roman" size="3"><font size="3"><strong><font size="2"><span><font face="Arial">原因：</font></span></font></strong></font></font></span><span><font face="Times New Roman" size="3"><font size="3"><font size="2"><span><font face="Arial">hibernate3 </font></span><span><font face="Times New Roman">many-to-one</font></span></font><span><font size="2">的默认选项是 </font><font face="Times New Roman"><font size="2">lazy = "proxy"</font></font></span></font></font></span><br />
<span><font face="Times New Roman" size="3"><font size="3"><span><strong>解决方法：</strong></span></font></font></span><span><font face="Times New Roman" size="3"><font size="3"><span><font face="宋体">&lt;many-to-one&gt;</font>&nbsp;&nbsp;&amp; &lt;set&gt; 中设置 </span></font></font></span><span><font face="Times New Roman" size="3"><font size="3"><span><font face="宋体">lazy="false"</font></span></font></font></span></font></font></font><img src ="http://www.blogjava.net/rain1102/aggbug/182707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-02-28 16:04 <a href="http://www.blogjava.net/rain1102/archive/2008/02/28/182707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Hibernate Search全文检索你的领域模型</title><link>http://www.blogjava.net/rain1102/archive/2008/02/18/180470.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 18 Feb 2008 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/02/18/180470.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/180470.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/02/18/180470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/180470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/180470.html</trackback:ping><description><![CDATA[<p>Hibernate Search项目的Beta第二版刚刚发布。InfoQ为此采访了Hibernate Search项目的发起人Emmanuel Bernard以了解更多细节，Emmanuel同时也是相关项目Hibernate Annotations和Hibernate EntityManager的发起人。根据Emmanuel所言，Hibernate Search目的是帮助Hibernate的使用者或是Java Persistence API（JPA）的使用者可以通过全文搜索索引来访问Hibernate或JPA管理的对象。Hibernate Search项目的主要特性包含以下几个方面：</p>
<p>Lucene集成——作为强大高效的检索引擎，Lucene的美名早已久经考验了； <br />
数据的自动插入和更新——当一个对象通过Hibernate添加或更新时，索引也会相应进行透明的更新； <br />
支持众多复杂的搜索方式——可快速的使用通配符进行搜索，以及多关键词全文检索（multi-word text searches）和近似或同义词搜索（approximation/synonym searches），或根据相关性排列搜索结果； <br />
搜索集群（Search Clustering）——Hibernate Search提供了内建搜索集群解决方案，其中包括一个基于JMS的异步查询和索引系统； <br />
对Lucene API接口的直接调用——如果用户打算处理某些特别复杂的问题，可以在查询中直接使用Lucene提供的API接口； <br />
对Lucene的自动管理——Hibernate Search可以管理并优化Lucene的索引，并且非常高效地使用Lucene的API接口。 <br />
项目的主要目标包含以下几个方面：</p>
<p>易用性——和Hibernate的ORM映射一样，Hibernate Search帮助用户实现了业务90%的工作，并且使用户专注于余下更为困难的业务实现部分； <br />
和已有的Hibernate/JPA编程模型保持一致性——更轻松地集成Hibernate/JPA编程模型是&#8220;一开始就致力要实现的目标&#8221;。</p><img src ="http://www.blogjava.net/rain1102/aggbug/180470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-02-18 15:16 <a href="http://www.blogjava.net/rain1102/archive/2008/02/18/180470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Set，List和Hibernate里面的PersistentSet</title><link>http://www.blogjava.net/rain1102/archive/2008/01/16/175733.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 16 Jan 2008 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/01/16/175733.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/175733.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/01/16/175733.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/175733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/175733.html</trackback:ping><description><![CDATA[最近两天突然对List和Set产生了兴趣，发觉很多地方都在讲他们的区别，包括是否可以添加重复对象以及他们的排序问题，仔细想想这个问题很有意思，我可以回答是有序的也可以说是无序的，这要看是怎么回答了，list是按照添加的先后顺序来排序的，所以可以说他是有序的，说list无序是说他内部是无序的，Set有序说的是Set是内部排序的，按照从小到大排序。说他无序说的是他不按照你输入的顺序来排序。<br />
然后看到Hibernate里面用到一对多，或者多对多时候会用到Set，然后我看自己的model，里面明明用的是HashSet，为什么他就可以按照集合里对象的字段排序呢？问了杨大哥终于知道了，原来在返回的时候返回给用户的是Hibernate的自己的类：org.hibernate.collection.PersistentSet。Oh my god!<br /><img src ="http://www.blogjava.net/rain1102/aggbug/175733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-01-16 17:39 <a href="http://www.blogjava.net/rain1102/archive/2008/01/16/175733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL下使用Hibernate的Query中setMaxResults方法出现错误</title><link>http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 26 Dec 2007 16:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/170767.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/170767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/170767.html</trackback:ping><description><![CDATA[MySQL下使用Hibernate的Query中setMaxResults方法出现错误：<br />
System Runtime Error: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query <br />
这是因为MySQL不支持top，而是使用了limit！<br />
目前还没找到解决办法，不知道为什么Hibernate搞出这玩意，干吗不转换一下，还是bug呢！晕！ <br />
<br />
终于解决了，不是人家的错误，而是我自己弄错了。方言干错了！失败！<img src ="http://www.blogjava.net/rain1102/aggbug/170767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-27 00:47 <a href="http://www.blogjava.net/rain1102/archive/2007/12/27/170767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>query.scroll()和query.setMaxResults();query.setFirstResult() </title><link>http://www.blogjava.net/rain1102/archive/2007/12/26/170754.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 26 Dec 2007 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/26/170754.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/170754.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/26/170754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/170754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/170754.html</trackback:ping><description><![CDATA[<p>query.scroll()和query.setMaxResults();query.setFirstResult() <br />
这这两种方法都可以取到一定范围内的数据，用来数据分页显示。那么那种方法更好呢？</p>
<p>scroll是用JDBC2.0的可滚动结果集实现；query.setMaxResults();query.setFirstResult()是数据库SQL语句实现。</p>
<p>在数据库进行分页是首选的方式。数据库分页实际上是利用数据库本身SQL扩展的功能进行分页，例如MySQL的 limit 0,50这样的SQL语句。不但速度快，而且非常节省内存。不过不是每种数据库的都有这种分页支持的SQL，例如SQL Server就不支持。</p>
<p>scroll是利用JDBC2.0的功能做分页的，那么就完全取决于特定数据库的JDBC Driver的实现了。事实上大部分JDBC Driver都是把所有的结果集都一次取到内存，然后再分页的。如果这个结果集非常大，例如几万条，不但程序执行速度会很慢，而且很容易导致out of memory。当然个别JDBC Driver使用了服务器端游标来实现，那么就不会导致这种问题，例如jTDS。</p><img src ="http://www.blogjava.net/rain1102/aggbug/170754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-26 23:13 <a href="http://www.blogjava.net/rain1102/archive/2007/12/26/170754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的复杂用法HibernateCallback</title><link>http://www.blogjava.net/rain1102/archive/2007/12/26/170638.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 26 Dec 2007 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/26/170638.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/170638.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/26/170638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/170638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/170638.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; line-height: 15.7pt">HibernateTemplate<span style="font-family: 宋体">还提供一种更加灵活的方式来操作数据库，通过这种方式可以完全使用</span>Hibernate<span style="font-family: 宋体">的操作方式。</span>HibernateTemplate<span style="font-family: 宋体">的灵活访问方式是通过如下两个方法完成：</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Object execute(HibernateCallback action)</p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>List execute(HibernateCallback action)</p>
<p style="text-indent: 21pt; line-height: 15.7pt"><span style="font-family: 宋体">这两个方法都需要一个</span>HibernateCallback<span style="font-family: 宋体">的实例，</span>HibernateCallback<span style="font-family: 宋体">实例可在任何有效的</span>Hibernate<span style="font-family: 宋体">数据访问中使用。程序开发者通过</span>HibernateCallback<span style="font-family: 宋体">，可以完全使用</span>Hibernate<span style="font-family: 宋体">灵活的方式来访问数据库，解决</span>Spring<span style="font-family: 宋体">封装</span>Hibernate<span style="font-family: 宋体">后灵活性不足的缺陷。</span>HibernateCallback<span style="font-family: 宋体">是一个接口，该接口只有一个方法</span>doInHibernate(org.hibernate.Session&nbsp;session)<span style="font-family: 宋体">，该方法只有一个参数</span>Session<span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt; line-height: 15.7pt"><span style="font-family: 宋体">通常，程序中采用实现</span>HibernateCallback<span style="font-family: 宋体">的匿名内部类来获取</span>HibernateCallback<span style="font-family: 宋体">的实例，方法</span>doInHibernate<span style="font-family: 宋体">的方法体就是</span>Spring<span style="font-family: 宋体">执行的持久化操作。具体代码如下：</span></p>
<p>public class PersonDaoImpl implements PersonDao</p>
<p>{<br />
&nbsp;// 私有实例变量保存SessionFactory<br />
&nbsp;private SessionFactory sessionFactory;<br />
&nbsp;// 依赖注入必须的setter方法<br />
&nbsp;public void setSessionFactory(SessionFactory sessionFactory){<br />
&nbsp;&nbsp;this.sessionFactory = sessionFactory;<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * <br />
&nbsp; * 通过人名查找所有匹配该名的Person实例<br />
&nbsp; * <br />
&nbsp; * @param name<br />
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配的人名<br />
&nbsp; * <br />
&nbsp; * @return 匹配该任命的全部Person集合<br />
&nbsp; * <br />
&nbsp; */<br />
&nbsp;public List findPersonsByName(final String name){<br />
&nbsp;&nbsp;// 创建HibernateTemplate实例<br />
&nbsp;&nbsp;HibernateTemplate hibernateTemplate =new HibernateTemplate(this.sessionFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 返回HibernateTemplate的execute的结果<br />
&nbsp;&nbsp;return (List) hibernateTemplate.execute(<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 创建匿名内部类<br />
&nbsp;&nbsp;&nbsp;&nbsp;new HibernateCallback(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Object doInHibernate(Session session) throws HibernateException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 使用条件查询的方法返回<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List result = session.createCriteria(Person.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(Restrictions.like("name", name+"%").list();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p>
<span style="font-family: 宋体">注意：方法</span><span lang="EN-US">doInHibernate</span><span style="font-family: 宋体">方法内可以访问</span><span lang="EN-US">Session</span><span style="font-family: 宋体">，该</span><span lang="EN-US">Session</span><span style="font-family: 宋体">对象是绑定到该线程的</span><span lang="EN-US">Session</span><span style="font-family: 宋体">实例。该方法内的持久层操作，与不使用</span><span lang="EN-US">Spring</span><span style="font-family: 宋体">时的持久层操作完全相同。这保证对于复杂的持久层访问，依然可以使用</span><span lang="EN-US">Hibernate</span><span style="font-family: 宋体">的访问方式。</span><img src ="http://www.blogjava.net/rain1102/aggbug/170638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-26 17:09 <a href="http://www.blogjava.net/rain1102/archive/2007/12/26/170638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateTemplate的常规用法</title><link>http://www.blogjava.net/rain1102/archive/2007/12/26/170633.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 26 Dec 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/26/170633.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/170633.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/26/170633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/170633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/170633.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; line-height: 15.7pt">HibernateTemplate<span style="font-family: 宋体">提供非常多的常用方法来完成基本的操作，比如通常的增加、删除、修改、查询等操作，</span>Spring 2.0<span style="font-family: 宋体">更增加对命名</span>SQL<span style="font-family: 宋体">查询的支持，也增加对分页的支持。大部分情况下，使用</span>Hibernate<span style="font-family: 宋体">的常规用法，就可完成大多数</span>DAO<span style="font-family: 宋体">对象的</span>CRUD<span style="font-family: 宋体">操作。下面是</span>HibernateTemplate<span style="font-family: 宋体">的常用方法简介：</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>void delete(Object entity)<span style="font-family: 宋体">：删除指定持久化实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>deleteAll(Collection entities)<span style="font-family: 宋体">：删除集合内全部持久化类实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>find(String queryString)<span style="font-family: 宋体">：根据</span>HQL<span style="font-family: 宋体">查询字符串来返回实例集合</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>findByNamedQuery(String queryName)<span style="font-family: 宋体">：根据命名查询返回实例集合</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>get(Class entityClass, Serializable id)<span style="font-family: 宋体">：根据主键加载特定持久化类的实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>save(Object entity)<span style="font-family: 宋体">：保存新的实例</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>saveOrUpdate(Object entity)<span style="font-family: 宋体">：根据实例状态，选择保存或者更新</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>update(Object entity)<span style="font-family: 宋体">：更新实例的状态，要求</span>entity<span style="font-family: 宋体">是持久状态</span></p>
<p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>setMaxResults(int maxResults)<span style="font-family: 宋体">：设置分页的大小</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/170633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-26 16:46 <a href="http://www.blogjava.net/rain1102/archive/2007/12/26/170633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse 开发 SSH 整合时 java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit 解决方案 </title><link>http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 23 Dec 2007 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/169853.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/169853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/169853.html</trackback:ping><description><![CDATA[ERROR [org.hibernate.proxy.BasicLazyInitializer] - CGLIB Enhancement failed: dao.User<br />
<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V<br />
&nbsp;at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77) <br />
<span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">Spring </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">和</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> Hibernate </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">共用的一些</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> jar </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">文件发生了版本冲突</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">, </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">删除</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> WEB-INF/lib/asm-2.2.3.jar </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">然后重启</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> Tomcat.</span><br />
<span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">asm-2.2.3.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm-attrs.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm-commons-2.2.3.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm-util-2.2.3.jar</span><img src ="http://www.blogjava.net/rain1102/aggbug/169853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-23 20:47 <a href="http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 参数设置一览表(转)</title><link>http://www.blogjava.net/rain1102/archive/2007/07/16/130548.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 16 Jul 2007 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/16/130548.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/130548.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/16/130548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/130548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/130548.html</trackback:ping><description><![CDATA[<p align=center>Hibernate 参数设置一览表</p>
<p align=left>&nbsp;</p>
<table summary="                Hibernate配置属性&#13;&#10;    " border=1>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.dialect</font></tt></td>
            <td>一个Hibernate <tt class=literal><font face=新宋体>Dialect</font></tt>类名允许Hibernate针对特定的关系数据库生成优化的SQL. <span class=strong>取值</span> <tt class=literal><font face=新宋体>full.classname.of.Dialect</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.show_sql</font></tt></td>
            <td>输出所有SQL语句到控制台. 有一个另外的选择是把<tt class=literal><font face=新宋体>org.hibernate.SQL</font></tt>这个log category设为<tt class=literal><font face=新宋体>debug</font></tt>。 <span class=strong>eg.</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.format_sql</font></tt></td>
            <td>在log和console中打印出更漂亮的SQL。 <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.default_schema</font></tt></td>
            <td>在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. <span class=strong>取值</span> <tt class=literal><font face=新宋体>SCHEMA_NAME</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.default_catalog</font></tt></td>
            <td>在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. <span class=strong>取值</span> <tt class=literal><font face=新宋体>CATALOG_NAME</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.session_factory_name</font></tt></td>
            <td><tt class=literal><font face=新宋体>SessionFactory</font></tt>创建后，将自动使用这个名字绑定到JNDI中. <span class=strong>取值</span> <tt class=literal><font face=新宋体>jndi/composite/name</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.max_fetch_depth</font></tt></td>
            <td>为单向关联(一对一, 多对一)的外连接抓取（outer join fetch）树设置最大深度. 值为<tt class=literal><font face=新宋体>0</font></tt>意味着将关闭默认的外连接抓取. <span class=strong>取值</span> 建议在<tt class=literal><font face=新宋体>0</font></tt>到<tt class=literal><font face=新宋体>3</font></tt>之间取值 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.default_batch_fetch_size</font></tt></td>
            <td>为Hibernate关联的批量抓取设置默认数量. <span class=strong>取值</span> 建议的取值为<tt class=literal><font face=新宋体>4</font></tt>, <tt class=literal><font face=新宋体>8</font></tt>, 和<tt class=literal><font face=新宋体>16</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.default_entity_mode</font></tt></td>
            <td>为由这个<tt class=literal><font face=新宋体>SessionFactory</font></tt>打开的所有Session指定默认的实体表现模式. <span class=strong>取值</span> <tt class=literal><font face=新宋体>dynamic-map</font></tt>, <tt class=literal><font face=新宋体>dom4j</font></tt>, <tt class=literal><font face=新宋体>pojo</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.order_updates</font></tt></td>
            <td>强制Hibernate按照被更新数据的主键，为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.generate_statistics</font></tt></td>
            <td>如果开启, Hibernate将收集有助于性能调节的统计数据. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.use_identifer_rollback</font></tt></td>
            <td>如果开启, 在对象被删除时生成的标识属性将被重设为默认值. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.use_sql_comments</font></tt></td>
            <td>如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为<tt class=literal><font face=新宋体>false</font></tt>. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
    </tbody>
</table>
<strong>Hibernate JDBC和连接(connection)属性<br>
<table summary="                Hibernate JDBC和连接(connection)属性&#13;&#10;    " border=1>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jdbc.fetch_size</font></tt></td>
            <td>非零值，指定JDBC抓取数量的大小 (调用<tt class=literal><font face=新宋体>Statement.setFetchSize()</font></tt>). </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jdbc.batch_size</font></tt></td>
            <td>非零值，允许Hibernate使用JDBC2的批量更新. <span class=strong>取值</span> 建议取<tt class=literal><font face=新宋体>5</font></tt>到<tt class=literal><font face=新宋体>30</font></tt>之间的值 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jdbc.batch_versioned_data</font></tt></td>
            <td>如果你想让你的JDBC驱动从<tt class=literal><font face=新宋体>executeBatch()</font></tt>返回正确的行计数 , 那么将此属性设为<tt class=literal><font face=新宋体>true</font></tt>(开启这个选项通常是安全的). 同时，Hibernate将为自动版本化的数据使用批量DML. 默认值为<tt class=literal><font face=新宋体>false</font></tt>. <span class=strong>eg.</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jdbc.factory_class</font></tt></td>
            <td>选择一个自定义的<tt class=literal><font face=新宋体>Batcher</font></tt>. 多数应用程序不需要这个配置属性. <span class=strong>eg.</span> <tt class=literal><font face=新宋体>classname.of.Batcher</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jdbc.use_scrollable_resultset</font></tt></td>
            <td>允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时，这个选项才是必要的, 否则Hibernate会使用连接的元数据. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jdbc.use_streams_for_binary</font></tt></td>
            <td>在JDBC读写<tt class=literal><font face=新宋体>binary (二进制)</font></tt>或<tt class=literal><font face=新宋体>serializable (可序列化)</font></tt> 的类型时使用流(stream)(系统级属性). <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jdbc.use_get_generated_keys</font></tt></td>
            <td>在数据插入数据库之后，允许使用JDBC3 <tt class=literal><font face=新宋体>PreparedStatement.getGeneratedKeys()</font></tt> 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题，请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.connection.provider_class</font></tt></td>
            <td>自定义<tt class=literal><font face=新宋体>ConnectionProvider</font></tt>的类名, 此类用来向Hibernate提供JDBC连接. <span class=strong>取值</span> <tt class=literal><font face=新宋体>classname.of.ConnectionProvider</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.connection.isolation</font></tt></td>
            <td>设置JDBC事务隔离级别. 查看<tt class=literal><font face=新宋体><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.Connection</font></tt>来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. <span class=strong>取值</span> <tt class=literal><font face=新宋体>1, 2, 4, 8</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.connection.autocommit</font></tt></td>
            <td>允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.connection.release_mode</font></tt></td>
            <td>指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用<tt class=literal><font face=新宋体>after_statement</font></tt>, 这样在每次JDBC调用后，都会主动的释放连接. 对于非JTA的连接, 使用<tt class=literal><font face=新宋体>after_transaction</font></tt>在每个事务结束时释放连接是合理的. <tt class=literal><font face=新宋体>auto</font></tt>将为JTA和CMT事务策略选择<tt class=literal><font face=新宋体>after_statement</font></tt>, 为JDBC事务策略选择<tt class=literal><font face=新宋体>after_transaction</font></tt>. <span class=strong>取值</span> <tt class=literal><font face=新宋体>on_close</font></tt> | <tt class=literal><font face=新宋体>after_transaction</font></tt> | <tt class=literal><font face=新宋体>after_statement</font></tt> | <tt class=literal><font face=新宋体>auto</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.connection.<span class=emphasis><em>&lt;propertyName&gt;</em></span></font></tt></td>
            <td>将JDBC属性<tt class=literal><font face=新宋体>propertyName</font></tt>传递到<tt class=literal><font face=新宋体>DriverManager.getConnection()</font></tt>中去. </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.jndi.<span class=emphasis><em>&lt;propertyName&gt;</em></span></font></tt></td>
            <td>将属性<tt class=literal><font face=新宋体>propertyName</font></tt>传递到JNDI <tt class=literal><font face=新宋体>InitialContextFactory</font></tt>中去. </td>
        </tr>
    </tbody>
</table>
Hibernate缓存属性<br>
<table summary="                Hibernate缓存属性&#13;&#10;    " border=1>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cache.provider_class</font></tt></td>
            <td>自定义的<tt class=literal><font face=新宋体>CacheProvider</font></tt>的类名. <span class=strong>取值</span> <tt class=literal><font face=新宋体>classname.of.CacheProvider</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cache.use_minimal_puts</font></tt></td>
            <td>以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中，这个设置对的集群缓存非常有用, 对集群缓存的实现而言，默认是开启的. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cache.use_query_cache</font></tt></td>
            <td>允许查询缓存, 个别查询仍然需要被设置为可缓存的. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cache.use_second_level_cache</font></tt></td>
            <td>能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<tt class=literal><font face=新宋体>&lt;cache&gt;</font></tt>的类，会默认开启二级缓存. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cache.query_cache_factory</font></tt></td>
            <td>自定义实现<tt class=literal><font face=新宋体>QueryCache</font></tt>接口的类名, 默认为内建的<tt class=literal><font face=新宋体>StandardQueryCache</font></tt>. <span class=strong>取值</span> <tt class=literal><font face=新宋体>classname.of.QueryCache</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cache.region_prefix</font></tt></td>
            <td>二级缓存区域名的前缀. <span class=strong>取值</span> <tt class=literal><font face=新宋体>prefix</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cache.use_structured_entries</font></tt></td>
            <td>强制Hibernate以更人性化的格式将数据存入二级缓存. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true|false</font></tt> </td>
        </tr>
    </tbody>
</table>
Hibernate事务属性<br>
<table summary="                Hibernate事务属性&#13;&#10;    " border=1>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.transaction.factory_class</font></tt></td>
            <td>一个<tt class=literal><font face=新宋体>TransactionFactory</font></tt>的类名, 用于Hibernate <tt class=literal><font face=新宋体>Transaction</font></tt> API (默认为<tt class=literal><font face=新宋体>JDBCTransactionFactory</font></tt>). <span class=strong>取值</span> <tt class=literal><font face=新宋体>classname.of.TransactionFactory</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>jta.UserTransaction</font></tt></td>
            <td>一个JNDI名字，被<tt class=literal><font face=新宋体>JTATransactionFactory</font></tt>用来从应用服务器获取JTA <tt class=literal><font face=新宋体>UserTransaction</font></tt>. <span class=strong>取值</span> <tt class=literal><font face=新宋体>jndi/composite/name</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.transaction.manager_lookup_class</font></tt></td>
            <td>一个<tt class=literal><font face=新宋体>TransactionManagerLookup</font></tt>的类名 - 当使用JVM级缓存，或在JTA环境中使用hilo生成器的时候需要该类. <span class=strong>取值</span> <tt class=literal><font face=新宋体>classname.of.TransactionManagerLookup</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.transaction.flush_before_completion</font></tt></td>
            <td>如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。<span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.transaction.auto_close_session</font></tt></td>
            <td>如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。<span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
    </tbody>
</table>
其他属性<br>
<table summary="                其他属性&#13;&#10;    " border=1>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.current_session_context_class</font></tt></td>
            <td>为"当前" <tt class=literal><font face=新宋体>Session</font></tt>指定一个(自定义的)策略。<span class=strong>eg.</span> <tt class=literal><font face=新宋体>jta</font></tt> | <tt class=literal><font face=新宋体>thread</font></tt> | <tt class=literal><font face=新宋体>custom.Class</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.query.factory_class</font></tt></td>
            <td>选择HQL解析器的实现. <span class=strong>取值</span> <tt class=literal><font face=新宋体>org.hibernate.hql.ast.ASTQueryTranslatorFactory</font></tt> or <tt class=literal><font face=新宋体>org.hibernate.hql.classic.ClassicQueryTranslatorFactory</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.query.substitutions</font></tt></td>
            <td>将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). <span class=strong>取值</span> <tt class=literal><font face=新宋体>hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.hbm2ddl.auto</font></tt></td>
            <td>在<tt class=literal><font face=新宋体>SessionFactory</font></tt>创建时，自动检查数据库结构，或者将数据库schema的DDL导出到数据库. 使用 <tt class=literal><font face=新宋体>create-drop</font></tt>时,在显式关闭<tt class=literal><font face=新宋体>SessionFactory</font></tt>时，将drop掉数据库schema. <span class=strong>取值</span> <tt class=literal><font face=新宋体>validate</font></tt> | <tt class=literal><font face=新宋体>update</font></tt> | <tt class=literal><font face=新宋体>create</font></tt> | <tt class=literal><font face=新宋体>create-drop</font></tt> </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>hibernate.cglib.use_reflection_optimizer</font></tt></td>
            <td>开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在<tt class=literal><font face=新宋体>hibernate.cfg.xml</font></tt>中设置此属性. <span class=strong>取值</span> <tt class=literal><font face=新宋体>true</font></tt> | <tt class=literal><font face=新宋体>false</font></tt> </td>
        </tr>
    </tbody>
</table>
SQL方言<br>
<p>你应当总是为你的数据库将<tt class=literal><font face=新宋体>hibernate.dialect</font></tt>属性设置成正确的 <tt class=literal><font face=新宋体>org.hibernate.dialect.Dialect</font></tt>子类. 如果你指定一种方言, Hibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫. </p>
Hibernate SQL方言 (<tt class=literal><font face=新宋体>hibernate.dialect</font></tt>) <br>
<table summary="                    Hibernate SQL方言 (hibernate.dialect)&#13;&#10;    " border=1>
    <thead>
        <tr>
            <th>RDBMS</th>
            <th>方言 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>DB2</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.DB2Dialect</font></tt></td>
        </tr>
        <tr>
            <td>DB2 AS/400</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.DB2400Dialect</font></tt></td>
        </tr>
        <tr>
            <td>DB2 OS390</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.DB2390Dialect</font></tt></td>
        </tr>
        <tr>
            <td>PostgreSQL</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.PostgreSQLDialect</font></tt></td>
        </tr>
        <tr>
            <td>MySQL</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.MySQLDialect</font></tt></td>
        </tr>
        <tr>
            <td>MySQL with InnoDB</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.MySQLInnoDBDialect</font></tt></td>
        </tr>
        <tr>
            <td>MySQL with MyISAM</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.MySQLMyISAMDialect</font></tt></td>
        </tr>
        <tr>
            <td>Oracle (any version)</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.OracleDialect</font></tt></td>
        </tr>
        <tr>
            <td>Oracle 9i/10g</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.Oracle9Dialect</font></tt></td>
        </tr>
        <tr>
            <td>Sybase</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.SybaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>Sybase Anywhere</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.SybaseAnywhereDialect</font></tt></td>
        </tr>
        <tr>
            <td>Microsoft SQL Server</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.SQLServerDialect</font></tt></td>
        </tr>
        <tr>
            <td>SAP DB</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.SAPDBDialect</font></tt></td>
        </tr>
        <tr>
            <td>Informix</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.InformixDialect</font></tt></td>
        </tr>
        <tr>
            <td>HypersonicSQL</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.HSQLDialect</font></tt></td>
        </tr>
        <tr>
            <td>Ingres</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.IngresDialect</font></tt></td>
        </tr>
        <tr>
            <td>Progress</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.ProgressDialect</font></tt></td>
        </tr>
        <tr>
            <td>Mckoi SQL</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.MckoiDialect</font></tt></td>
        </tr>
        <tr>
            <td>Interbase</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.InterbaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>Pointbase</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.PointbaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>FrontBase</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.FrontbaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>Firebird</td>
            <td><tt class=literal><font face=新宋体>org.hibernate.dialect.FirebirdDialect</font></tt></td>
        </tr>
    </tbody>
</table>
Hibernate日志类别<br>
<table summary="                    Hibernate日志类别&#13;&#10;    " border=1>
    <thead>
        <tr>
            <th>类别 </th>
            <th>功能 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.SQL</font></tt></td>
            <td>在所有SQL DML语句被执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.type</font></tt></td>
            <td>为所有JDBC参数记录日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.tool.hbm2ddl</font></tt></td>
            <td>在所有SQL DDL语句执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.pretty</font></tt></td>
            <td>在session清洗(flush)时，为所有与其关联的实体(最多20个)的状态记录日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.cache</font></tt></td>
            <td>为所有二级缓存的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction</font></tt></td>
            <td>为事务相关的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.jdbc</font></tt></td>
            <td>为所有JDBC资源的获取记录日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.hql.AST</font></tt></td>
            <td>在解析查询的时候,记录HQL和SQL的AST分析日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.secure</font></tt></td>
            <td>为JAAS认证请求做日志 </td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate</font></tt></td>
            <td>为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助) </td>
        </tr>
    </tbody>
</table>
&nbsp;JTA TransactionManagers<br>
<table summary="JTA TransactionManagers" border=1>
    <thead>
        <tr>
            <th>Transaction工厂类 </th>
            <th align=middle>应用程序服务器 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.JBossTransactionManagerLookup</font></tt></td>
            <td align=middle>JBoss</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.WeblogicTransactionManagerLookup</font></tt></td>
            <td align=middle>Weblogic</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.WebSphereTransactionManagerLookup</font></tt></td>
            <td align=middle>WebSphere</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</font></tt></td>
            <td align=middle>WebSphere 6</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.OrionTransactionManagerLookup</font></tt></td>
            <td align=middle>Orion</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.ResinTransactionManagerLookup</font></tt></td>
            <td align=middle>Resin</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.JOTMTransactionManagerLookup</font></tt></td>
            <td align=middle>JOTM</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.JOnASTransactionManagerLookup</font></tt></td>
            <td align=middle>JOnAS</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.JRun4TransactionManagerLookup</font></tt></td>
            <td align=middle>JRun4</td>
        </tr>
        <tr>
            <td><tt class=literal><font face=新宋体>org.hibernate.transaction.BESTransactionManagerLookup</font></tt></td>
            <td align=middle>Borland ES</td>
        </tr>
    </tbody>
</table>
原文地址：<a href="http://www.ideagrace.com/html/doc/2007/01/30/08608.html">http://www.ideagrace.com/html/doc/2007/01/30/08608.html</a><br></strong><img src ="http://www.blogjava.net/rain1102/aggbug/130548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-16 13:46 <a href="http://www.blogjava.net/rain1102/archive/2007/07/16/130548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Open Session in Test 及自动Rollback</title><link>http://www.blogjava.net/rain1102/archive/2007/05/15/117541.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 15 May 2007 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/05/15/117541.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/117541.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/05/15/117541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/117541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/117541.html</trackback:ping><description><![CDATA[又是来自Spring这个神奇国度的东西， 你可以让testCase继承于AbstractTransactionalDataSourceSpringContextTests，就可以做到Open Session in Test ，解决Hibernate的lazy-load问题；而且接管原来的DAO里的事务控制定义，通过setDefaultRollback(boolean)方法控制最后回滚还是提交，如果默认为回滚，则测试产生数据变动不会影响数据库内数据。<br>&nbsp;<br>如果不能继承于这个基类，可以自己简单编写，代码是这样的：<br>&nbsp;&nbsp;<span style="COLOR: #008000"> protected PlatformTransactionManager transactionManager;<br>&nbsp;&nbsp; protected TransactionStatus transactionStatus;<br>&nbsp;&nbsp; protected boolean defaultRollback = true;<br>&nbsp;&nbsp; public void setUp()<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transactionManager = (PlatformTransactionManager) ctx.getBean("transactionManager");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public void tearDown()<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (defaultRollback)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transactionManager.rollback(this.transactionStatus);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transactionManager.commit(this.transactionStatus);<br>&nbsp;&nbsp;&nbsp; }<br></span>(注，hibernate太奸诈了，如果全部默认回滚，只会在session里干活，一点不写数据库，达不到完全的测试效果。)<img src ="http://www.blogjava.net/rain1102/aggbug/117541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-05-15 11:09 <a href="http://www.blogjava.net/rain1102/archive/2007/05/15/117541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Spring中的回滚问题AbstractTransactionalDataSourceSpringContextTests</title><link>http://www.blogjava.net/rain1102/archive/2007/05/15/117518.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 15 May 2007 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/05/15/117518.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/117518.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/05/15/117518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/117518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/117518.html</trackback:ping><description><![CDATA[AbstractTransactionalDataSourceSpringContextTests缺乏对hibernate session的处理，需要对其进行扩展，扩展基本思路是在事务开始后，结束前把测试方法包装在
<p>HibernateTemaplate.executeWithSession(...){ <br>public Object doInHibernate(Session session) { <br>runTest(); <br>session.flush();//synchornize database, errors will be reported. <br>session.clear();}...}<br>而AbstractTransactionalDataSourceSpringContextTests只要你不调用super.setDefaultRollback(false);这个基类默认就会回滚! 于是由此产生hibernate偷懒,无法发现数据库操作,然后我们建议你在测试中显示调用session.flush <br>或者参杂一些查询调用(其实也是为了触发session.flush)。</p>
<p>不过这里面也有些陷阱:如果你的测试还是会把数据写入了数据库的话,可能是由于你加载的spring配置文件里有多个事务管理器或session工厂,从而导致AbstractTransactionalDataSourceSpringContextTests没有获得正确的TransactionManager或SessionFactory,所以就没能回滚不过这种错误也不太容易犯,因为AbstractTransactionalDataSourceSpringContextTests默认按类型组装,如果她发现有多个TransactionManager类型的bean是要报错的,此时你需要调用setAutowireMode(this.AUTOWIRE_BY_NAME);使其按名称组装。<br><br>另外值得注意的是，使用MYSQL时候表的类型选择。例如</p>
<p><span style="COLOR: rgb(0,0,255)">CREATE</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">TABLE</span><span style="COLOR: rgb(0,0,0)">&nbsp;`myisam`&nbsp;(<br>&nbsp;&nbsp;`id`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)">int</span><span style="COLOR: rgb(0,0,0)">(</span><span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">11</span><span style="COLOR: rgb(0,0,0)">)&nbsp;</span><span style="COLOR: rgb(128,128,128)">NOT</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">NULL</span><span style="COLOR: rgb(0,0,0)">&nbsp;auto_increment,<br>&nbsp;&nbsp;`name`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)">varchar</span><span style="COLOR: rgb(0,0,0)">(</span><span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">100</span><span style="COLOR: rgb(0,0,0)">)&nbsp;</span><span style="COLOR: rgb(0,0,255)">default</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">NULL</span><span style="COLOR: rgb(0,0,0)">,<br>&nbsp;&nbsp;`content`&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)">text</span><span style="COLOR: rgb(0,0,0)">,<br>&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">PRIMARY</span><span style="COLOR: rgb(0,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">KEY</span><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp;(`id`)<br>)&nbsp;ENGINE</span><span style="COLOR: rgb(128,128,128)">=</span><span style="COLOR: rgb(0,0,0)">MyISAM&nbsp;</span><span style="COLOR: rgb(0,0,255)">DEFAULT</span><span style="COLOR: rgb(0,0,0)">&nbsp;CHARSET</span><span style="COLOR: rgb(128,128,128)">=</span><span style="COLOR: rgb(0,0,0)">gbk;<br>这时候应该把类型改为InnoDB。</span></p>
<p><span style="COLOR: rgb(0,0,0)">MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎：&#183; MyISAM管理非事务表。它提供高速存储和检索，以及全文搜索能力。MyISAM在所有MySQL配置里被支持，它是默认的存储引擎，除非你配置 MySQL默认使用另外一个引擎。 &#183;MEMORY存储引擎提供&#8220;内存中&#8221;表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样， MEMORY和MERGE存储引擎处理非事务表，这两个引擎也都被默认包含在MySQL中。 释：MEMORY存储引擎正式地被确定为HEAP引擎。&#183; InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里，你可以按照喜好通过配置MySQL来允许或禁止任一引擎。&#183;EXAMPLE存储引擎是一个&#8220;存根&#8221;引擎，它不做什么。你可以用这个 引擎创建表，但没有数据被存储于其中或从其中检索。</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/117518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-05-15 10:06 <a href="http://www.blogjava.net/rain1102/archive/2007/05/15/117518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的多对多映射</title><link>http://www.blogjava.net/rain1102/archive/2007/04/10/109628.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 10 Apr 2007 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/04/10/109628.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/109628.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/04/10/109628.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/109628.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/109628.html</trackback:ping><description><![CDATA[Payment.java<br><br><span style="COLOR: #003300">private Set&lt;Subscription&gt; subscriptions = new HashSet&lt;Subscription&gt;(0);</span><br><br>Subscription.java<br><br><span style="COLOR: #003300">&nbsp;private Set&lt;Payment&gt; payments = new HashSet&lt;Payment&gt;(0);</span><br><br>Payment.hbm.xml<br><br><span style="COLOR: #003300">&lt;set name="subscriptions" table="subscriptionpayment" inverse="false"<br>&nbsp;&nbsp;&nbsp;cascade="none"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;column name="PaymentID" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&lt;many-to-many class="com.test.eric.model.Subscription"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;column name="SubscriptionID" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/many-to-many&gt;<br>&nbsp;&lt;/set&gt;</span><br><br>Subscription.hbm.xml<br><br><span style="COLOR: #003300">&lt;set name="payments" table="subscriptionpayment" inverse="false"<br>&nbsp;&nbsp;&nbsp;cascade="none"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;column name="SubscriptionID" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&lt;many-to-many class="com.test.eric.model.Payment"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;column name="PaymentID" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/many-to-many&gt;<br>&nbsp;&lt;/set&gt;</span><img src ="http://www.blogjava.net/rain1102/aggbug/109628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-04-10 14:31 <a href="http://www.blogjava.net/rain1102/archive/2007/04/10/109628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的主键生成方法native与assigned</title><link>http://www.blogjava.net/rain1102/archive/2007/04/04/108395.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Apr 2007 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/04/04/108395.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/108395.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/04/04/108395.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/108395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/108395.html</trackback:ping><description><![CDATA[在用Hibernate的时候，当有表中的主键是库自动生成的时候将使用native。<br>&lt;generator class="native"&gt;&lt;/generator&gt;<br>而当是自己添加的时候则需要改为assigned。<br>&lt;generator class="assigned"&gt;&lt;/generator&gt;<br>否则将会出现异常！<img src ="http://www.blogjava.net/rain1102/aggbug/108395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-04-04 11:46 <a href="http://www.blogjava.net/rain1102/archive/2007/04/04/108395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WSH(webwork+spring+hibernate)+mysql</title><link>http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 19 Dec 2006 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/88796.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/88796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/88796.html</trackback:ping><description><![CDATA[<p>
				<font color="#006400">web.xml</font>
				<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />&lt;web-app&gt;<br />&#160;&#160;&#160; &lt;display-name&gt;Third Team&lt;/display-name&gt;</p>
		<p>&lt;!--&#160; &#160;&lt;filter&gt;<br />&#160;&#160;&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />&#160;&#160;&lt;filter-class&gt;com.founder.study.forum.helper.FilterChar&lt;/filter-class&gt;<br />&#160;&#160;&lt;init-param&gt;<br />&#160;&#160;&#160;&lt;param-name&gt;encoding&lt;/param-name&gt;<br />&#160;&#160;&#160;&lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />&#160;&#160;&lt;/init-param&gt;<br />&#160;&lt;/filter&gt;--&gt;<br />&#160;&#160;&#160; &lt;filter&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;webwork&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-class&gt;com.opensymphony.webwork.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />&#160;&#160;&#160; &lt;/filter&gt;<br />&lt;!--&#160;&#160; &lt;filter&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt;<br />&#160;&#160;&#160; &lt;/filter&gt;</p>
		<p>&#160;&#160;&#160; &lt;filter-mapping&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&#160;&#160;&#160; &lt;/filter-mapping&gt; <br />&#160;&lt;filter-mapping&gt;<br />&#160;&#160;&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />&#160;&#160;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&#160;&lt;/filter-mapping&gt;--&gt;<br />&#160;&#160;&#160; &lt;filter-mapping&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;webwork&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&#160;&#160;&#160; &lt;/filter-mapping&gt;</p>
		<p>&#160;&#160;&#160; &lt;listener&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />&#160;&#160;&#160; &lt;/listener&gt;</p>
		<p>&#160;&#160;&#160; &lt;welcome-file-list&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />&#160;&#160;&#160; &lt;/welcome-file-list&gt;<br />&#160;&#160;&#160; &lt;!--<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; This typically isn't required, as the taglib is included in webwork.jar.<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; If you really need a taglib configuration within web.xml, copy webwork/src/java/META-INF/taglib.tld<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; to the WEB-INF directory as webwork.tld.<br />&#160;&#160;&#160;&#160; --&gt;<br />&#160;&#160;&#160; &lt;taglib&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;taglib-uri&gt;webwork&lt;/taglib-uri&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;taglib-location&gt;/WEB-INF/lib/webwork-2.2.4.jar&lt;/taglib-location&gt;<br />&#160;&#160;&#160; &lt;/taglib&gt;<br />&#160;&#160;&#160; &lt;!-- &lt;taglib&gt;<br />&#160;&#160;&lt;taglib-uri&gt;sitemesh-decorator&lt;/taglib-uri&gt;<br />&#160;&#160;&lt;taglib-location&gt;/WEB-INF/sitemesh-decorator.tld&lt;/taglib-location&gt; <br />&#160;&lt;/taglib&gt;<br />&#160;&lt;taglib&gt; <br />&#160;&#160;&lt;taglib-uri&gt;sitemesh-page&lt;/taglib-uri&gt;<br />&#160;&#160;&lt;taglib-location&gt;/WEB-INF/sitemesh-page.tld&lt;/taglib-location&gt;<br />&#160;&lt;/taglib&gt;--&gt;<br />&lt;/web-app&gt;<br /><br /><font color="#006400">xwork.xml<br /><font color="#000000">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "</font><a href="http://www.opensymphony.com/xwork/xwork-1.1.1.dtd"><font color="#000000">http://www.opensymphony.com/xwork/xwork-1.1.1.dtd</font></a></font><font color="#000000">"&gt;</font></p>
		<p>
				<font color="#006400">
						<font color="#000000">&lt;xwork&gt;<br />&#160;&lt;include file="webwork-default.xml" /&gt;<br />&#160;&#160;&#160; <br />&#160;&lt;package name="default" extends="webwork-default"&gt;<br />&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160; &lt;interceptors&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-stack name="modelParamsStack"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="model-driven" /&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="params" /&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/interceptor-stack&gt;<br />&#160;&#160;&#160;&#160; &lt;/interceptors&gt;<br />&#160;&#160;&#160;&#160; <br />&#160;&#160;<br />&#160;&lt;/package&gt;<br />&lt;/xwork&gt;<br /></font>
						<br />
				</font>
				<font color="#006400">webwork.properties<br /></font>
				<font color="#000000">webwork.objectFactory = spring<br />webwork.devMode = true<br />webwork.tag.altSyntax=true<br />webwork.locale=zh_CN<br />webwork.i18n.encoding=UTF-8<br />webwork.custom.i18n.resources=com.founder.study.forum.resource.ApplicationResources<br /><br /></font>
				<font color="#006400">jdbc.properties<br /></font>
				<font color="#000000"># Properties file with JDBC-related settings.<br /># Applied by PropertyPlaceholderConfigurer from "applicationContext-*.xml".<br /># Targeted at system administrators, to avoid touching the context XML files.</font>
		</p>
		<p>
				<font color="#000000">jdbc.driverClassName=org.gjt.mm.mysql.Driver<br />jdbc.url=jdbc:mysql://localhost:3306/forum?useUnicode=true&amp;characterEncoding=utf-8<br />jdbc.username=root<br />jdbc.password=root</font>
		</p>
		<p>
				<br />
				<font color="#000000">hibernate.dialect=org.hibernate.dialect.MySQLDialect<br />hibernate.show_sql=true<br />hibernate.hbm2ddl.auto=update<br /><br /><font color="#006400">applicationContext.xml</font><br /></font>
		</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</p>
		<p>&lt;beans default-autowire="byName"&gt;<br />&lt;!-- JDBC Config /author Jerome_mao--&gt;<br />&#160;&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />&#160;&#160;&lt;property name="location" value="/WEB-INF/jdbc.properties" /&gt;<br />&#160;&lt;/bean&gt;<br />&lt;!-- Config DateSource /author Jerome_mao--&gt;<br />&#160;&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />&#160;&#160;&lt;property name="driverClassName" value="${jdbc.driverClassName}" /&gt;<br />&#160;&#160;&lt;property name="url" value="${jdbc.url}" /&gt;<br />&#160;&#160;&lt;property name="username" value="${jdbc.username}" /&gt;<br />&#160;&#160;&lt;property name="password" value="${jdbc.password}" /&gt;<br />&#160;&lt;/bean&gt;</p>
		<p>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" singleton="true"&gt;<br />&#160;&lt;property name="dataSource"&gt;<br />&#160;&#160;&lt;ref local="dataSource" /&gt;<br />&#160;&lt;/property&gt;<br />&#160; &#160;&lt;property name="mappingResources"&gt;<br />&#160;&#160;&lt;list&gt;<br />&#160;&#160;&#160;&lt;value&gt;com/founder/study/forum/model/Threadgroups.hbm.xml&lt;/value&gt;<br />&#160;&#160;&#160;&lt;value&gt;com/founder/study/forum/model/User.hbm.xml&lt;/value&gt;<br />&#160;&#160;&#160;&lt;value&gt;com/founder/study/forum/model/Userrole.hbm.xml&lt;/value&gt;<br />&#160;&#160;&lt;/list&gt;<br />&#160;&lt;/property&gt; <br />&lt;property name="hibernateProperties"&gt;<br />&#160;&#160;&lt;props&gt;<br />&#160;&#160;&#160;&lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt;<br />&#160;&#160;&#160;&lt;prop key="hibernate.show_sql"&gt;${hibernate.show_sql}&lt;/prop&gt;<br />&lt;!-- &#160;&#160;&lt;prop key="hibernate.hbm2ddl.auto"&gt;${hibernate.hbm2ddl.auto}&lt;/prop&gt;--&gt;<br />&#160;&#160;&lt;/props&gt;<br />&lt;/property&gt;&#160;<br />&lt;/bean&gt;<br />&#160;<br />&#160;&lt;!-- Hibernate transaction processing /author Jerome_mao--&gt;<br />&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />&#160;&lt;property name="sessionFactory"&gt;<br />&#160;&#160;&lt;ref local="sessionFactory" /&gt;<br />&#160;&lt;/property&gt;<br />&lt;/bean&gt;</p>
		<p>&lt;!-- commerce logic service config --&gt;<br />&lt;!-- User Service&#160; /author Jerome_mao--&gt;<br />&lt;bean id="userService" class="com.founder.study.forum.service.impl.UserServiceImpl"&gt;<br />&#160;&lt;property name="userDAO"&gt;<br />&#160;&#160;&lt;ref bean="userDAO"/&gt;<br />&#160;&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;!-- Data persistent layer&#160; --&gt;<br />&lt;!-- User login&#160;&#160; /author Jerome_mao --&gt;<br />&lt;bean id="userDAO" class="com.founder.study.forum.dao.hibernate.UserDAOHibernate"&gt;<br />&#160;&lt;property name="sessionFactory"&gt;<br />&#160;&#160;&lt;ref local="sessionFactory" /&gt;<br />&#160;&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="forumService" class="com.founder.study.forum.service.impl.ForumServiceImpl"&gt;<br />&#160; &lt;property name="forumTypeDAO"&gt;<br />&#160;&#160;&#160; &lt;ref local="forumTypeDAO"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="forumTypeDAO" class="com.founder.study.forum.dao.hibernate.ForumTypeDAOHibernate"&gt;<br />&#160; &lt;property name="sessionFactory"&gt;<br />&#160;&#160;&#160; &lt;ref local="sessionFactory"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="messageService" class="com.founder.study.forum.service.impl.MessageServiceImpl"&gt;<br />&#160; &lt;property name="messageTypeDAO"&gt;<br />&#160;&#160;&#160; &lt;ref local="messageTypeDAO"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="messageTypeDAO" class="com.founder.study.forum.dao.hibernate.MessageTypeDAOHibernate"&gt;<br />&#160;&#160; &lt;property name="sessionFactory"&gt;<br />&#160;&#160;&#160;&#160; &lt;ref local="sessionFactory"/&gt;<br />&#160;&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="adminService" class="com.founder.study.forum.service.impl.AdminServiceImpl"&gt;<br />&#160; &lt;property name="adminDAO"&gt;<br />&#160;&#160;&#160; &lt;ref local="adminDAO"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="adminDAO" class="com.founder.study.forum.dao.hibernate.AdminDAOHibernate"&gt;<br />&#160;&#160; &lt;property name="sessionFactory"&gt;<br />&#160;&#160;&#160;&#160; &lt;ref local="sessionFactory"/&gt;<br />&#160;&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;/beans&gt;<br /></p><img src ="http://www.blogjava.net/rain1102/aggbug/88796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-19 14:55 <a href="http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork+spring+hibernate架构目录结构</title><link>http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 11 Dec 2006 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/86877.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/86877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/86877.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="500" border="0">
				<tbody>
						<tr>
								<td width="10">
								</td>
								<td width="490">
										<span class="oblog_text">
												<p class="MsoNormal">
														<span lang="EN-US">
																<span>&#160;&#160;&#160;&#160;&#160;转自<a href="/black_zerg/archive/2005/05/30/5327.html">http://www.blogjava.net/black_zerg/archive/2005/05/30/5327.html</a>&#160; </span>
														</span>
												</p>
												<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
														<tbody>
																<tr>
																		<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.blogjava.net/images/blogjava_net/black_zerg/1560/o_image002.jpg" width="200" onload="javascript:if(this.width&gt;1000){this.resized=true;this.style.width=1000;}" border="0" />
																						</span>
																				</p>
																		</td>
																		<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;&#160;&#160;&#160;&#160;&#160; </span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">在</span>
																						<span lang="EN-US">src</span>
																						<span style="FONT-FAMILY: 宋体">目录下为</span>
																						<span lang="EN-US">
																								<a title="Java爱好者" href="/rain1102">Java</a>
																						</span>
																						<span style="FONT-FAMILY: 宋体">源码</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">dao<span>&#160;&#160;&#160; </span></span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">负责数据访问对象的定义和实现</span>
																								<span lang="EN-US">
																										<?xml:namespace prefix = o /?>
																										<o:p>
																										</o:p>
																								</span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">其中</span>
																						<span lang="EN-US">Dao</span>
																						<span style="FONT-FAMILY: 宋体">结尾为接口，</span>
																						<span lang="EN-US">Impl</span>
																						<span style="FONT-FAMILY: 宋体">结尾为实现。目前一般用</span>
																						<span lang="EN-US">hibernate</span>
																						<span style="FONT-FAMILY: 宋体">做实现。<br /></span>
																						<b>
																								<span lang="EN-US">domain </span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">实体对象<br /><br /></span>
																						</b>
																						<b>
																								<span lang="EN-US">logic<span>&#160;&#160; </span></span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">针对实体对象封装的逻辑</span>
																								<span lang="EN-US">
																										<o:p>
																										</o:p>
																								</span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">
																										<span>&#160;</span>
																								</span>
																						</b>
																						<span style="FONT-FAMILY: 宋体">这里</span>
																						<span lang="EN-US">service</span>
																						<span style="FONT-FAMILY: 宋体">是外观接口，</span>
																						<span lang="EN-US">serviceimpl</span>
																						<span style="FONT-FAMILY: 宋体">是实现，考虑目前情况简单，并没有进一步分离逻辑，业务逻辑都在</span>
																						<span lang="EN-US">impl</span>
																						<span style="FONT-FAMILY: 宋体">中完成。</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">web<span>&#160;&#160;&#160; </span></span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">界面相关的</span>
																								<span lang="EN-US">
																										<a title="Java爱好者" href="/rain1102">Java</a>
																								</span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">类</span>
																								<span lang="EN-US">
																										<o:p>
																										</o:p>
																								</span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																								<span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid">common</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">是一些常用类，如处理中文问题的</span>
																						<span lang="EN-US">filter.</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																								<span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid">displaytag</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">中放了</span>
																						<span lang="EN-US">displaytag</span>
																						<span style="FONT-FAMILY: 宋体">相关的类，多为</span>
																						<span lang="EN-US">wrapper.</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																								<span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid">webwork</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">中都是对应的</span>
																						<span lang="EN-US">action</span>
																						<span style="FONT-FAMILY: 宋体">，</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 10.5pt">
																						<span style="FONT-FAMILY: 宋体">其中</span>
																						<span lang="EN-US"> BaseAction</span>
																						<span style="FONT-FAMILY: 宋体">是基本的抽象类，基本后续开发应继承此类</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 10.5pt">
																						<span lang="EN-US">CrudAction</span>
																						<span style="FONT-FAMILY: 宋体">是为了一般的</span>
																						<span lang="EN-US">Crud</span>
																						<span style="FONT-FAMILY: 宋体">工作而作的一个抽象类，可以继承用来简化工作。</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 10.5pt">
																						<span style="FONT-FAMILY: 宋体">而</span>
																						<span lang="EN-US">CaseDispatcher</span>
																						<span style="FONT-FAMILY: 宋体">负责菜单点击后分发到相关</span>
																						<span lang="EN-US">Action</span>
																						<span style="FONT-FAMILY: 宋体">，同时处理权限和</span>
																						<span lang="EN-US">session</span>
																						<span style="FONT-FAMILY: 宋体">工作。<br />&#160; </span>
																						<span style="FONT-FAMILY: 宋体">其他</span>
																						<span lang="EN-US">action</span>
																						<span style="FONT-FAMILY: 宋体">按模块进行了组织</span>
																				</p>
																		</td>
																</tr>
																<tr>
																		<td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.blogjava.net/images/blogjava_net/black_zerg/1560/o_image004.jpg" width="200" onload="javascript:if(this.width&gt;1000){this.resized=true;this.style.width=1000;}" border="0" />
																						</span>
																				</p>
																		</td>
																		<td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span style="FONT-FAMILY: 宋体">左边是</span>
																						<span lang="EN-US">webroot</span>
																						<span style="FONT-FAMILY: 宋体">的结构</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<o:p>&#160;</o:p>
																						</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<o:p>&#160;</o:p>
																						</span>
																				</p>
																				<p class="MsoNormal">
																						<span style="FONT-FAMILY: 宋体">重要的配置文件有：</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">Spring<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">applicationContext.xml</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">applicationContext-db.xml</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">Webwork<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">xwork.xml</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">webwork.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">i18n<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>labels.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">log4j<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>log4j.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">displaytag<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>displaytag.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">dbConnect<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>jdbc.properties</span>
																				</p>
																		</td>
																</tr>
														</tbody>
												</table>
												<p class="MsoNormal">
														<span lang="EN-US">
																<o:p>&#160;</o:p>
														</span>
												</p>
												<p class="MsoNormal">
														<span style="FONT-FAMILY: 宋体">关于一些技术难点和细节：</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>1．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">各框架连接：</span>
														<span lang="EN-US">spring</span>
														<span style="FONT-FAMILY: 宋体">到</span>
														<span lang="EN-US">hibernate</span>
														<span style="FONT-FAMILY: 宋体">使用</span>
														<span lang="EN-US">spring</span>
														<span style="FONT-FAMILY: 宋体">的</span>
														<span lang="EN-US">hibernate</span>
														<span style="FONT-FAMILY: 宋体">支持。</span>
														<span lang="EN-US">Spring</span>
														<span style="FONT-FAMILY: 宋体">到</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">使用</span>
														<span lang="EN-US">autoware</span>
														<span style="FONT-FAMILY: 宋体">的拦截机制自动装配。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>2．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">列表的问题，采用</span>
														<span lang="EN-US">displaytag</span>
														<span style="FONT-FAMILY: 宋体">。功能强大，使用简洁，可实现排序和数据导出。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>3．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">数据下载，使用</span>
														<span lang="EN-US">displaytag</span>
														<span style="FONT-FAMILY: 宋体">自带的</span>
														<span lang="EN-US">excel</span>
														<span style="FONT-FAMILY: 宋体">下载</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>4．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">文件上传，使用</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">提供的解决方案，用拦截机制实现。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>5．</span>
														</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">代码组织方面，我们使用</span>
														<span lang="EN-US">taglib</span>
														<span style="FONT-FAMILY: 宋体">和</span>
														<span lang="EN-US">css</span>
														<span style="FONT-FAMILY: 宋体">技术使</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">中页面逻辑减少到最小，一般情况完全可以不使用</span>
														<span lang="EN-US">&lt;% %&gt;</span>
														<span style="FONT-FAMILY: 宋体">的</span>
														<span lang="EN-US">script</span>
														<span style="FONT-FAMILY: 宋体">段</span>
														<span style="FONT-FAMILY: 宋体">。同时我们使用两个</span>
														<span lang="EN-US">include</span>
														<span style="FONT-FAMILY: 宋体">来包含常用的</span>
														<span lang="EN-US">taglib</span>
														<span style="FONT-FAMILY: 宋体">定义，</span>
														<span lang="EN-US">js</span>
														<span style="FONT-FAMILY: 宋体">引用和</span>
														<span lang="EN-US">html</span>
														<span style="FONT-FAMILY: 宋体">结构，使</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">代码非常简洁。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>6．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">中文问题</span>
														<span style="FONT-FAMILY: 宋体">我们使用</span>
														<span lang="EN-US">filter</span>
														<span style="FONT-FAMILY: 宋体">来解决页面</span>
														<span lang="EN-US">gbk</span>
														<span style="FONT-FAMILY: 宋体">到</span>
														<span lang="EN-US">
																<a title="Java爱好者" href="/rain1102">Java</a>
														</span>
														<span style="FONT-FAMILY: 宋体">程序</span>
														<span lang="EN-US">unicode</span>
														<span style="FONT-FAMILY: 宋体">的转换，同时通过正确的设置数据库连接</span>
														<span lang="EN-US">url</span>
														<span style="FONT-FAMILY: 宋体">完成和数据库之间的交互。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>7．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span lang="EN-US">I18n</span>
														<span style="FONT-FAMILY: 宋体">国际化。我们要求在</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">代码中不出现中文，所有提示信息都通过资源文件</span>
														<span lang="EN-US">labels.properties</span>
														<span style="FONT-FAMILY: 宋体">来完成。页面中可以使用</span>
														<span lang="EN-US">jstl</span>
														<span style="FONT-FAMILY: 宋体">或</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">标签来调用。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>8．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">界面验证问题。使用</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">的</span>
														<span lang="EN-US">validate</span>
														<span style="FONT-FAMILY: 宋体">机制用</span>
														<span lang="EN-US">xml</span>
														<span style="FONT-FAMILY: 宋体">定义，或在</span>
														<span lang="EN-US">action</span>
														<span style="FONT-FAMILY: 宋体">中代码判断。</span>
												</p>
										</span>
								</td>
						</tr>
				</tbody>
		</table><img src ="http://www.blogjava.net/rain1102/aggbug/86877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-11 13:21 <a href="http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>