ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>猫咪在线永久网站,美国十次综合久久,国产三级视频在线播放线观看http://www.aygfsteel.com/rain1102/category/37639.html<br/><font color="green" style="font-family: 华文行楷;font-size:16px;">子曰åQšå±é‚¦ä¸å…¥ï¼Œä¹±é‚¦ä¸å±…。天下有道则见,无道则隐ã€?lt;/font><font color="#3C1435"></font>zh-cnWed, 11 Nov 2009 17:25:44 GMTWed, 11 Nov 2009 17:25:44 GMT60Hibernateä¸­ä¸»é”®å¢žé•¿æ­¥é•¿äØ“50的问é¢?Oraclehttp://www.aygfsteel.com/rain1102/archive/2009/11/11/302019.htmlEric.ZhouEric.ZhouWed, 11 Nov 2009 13:54:00 GMThttp://www.aygfsteel.com/rain1102/archive/2009/11/11/302019.htmlhttp://www.aygfsteel.com/rain1102/comments/302019.htmlhttp://www.aygfsteel.com/rain1102/archive/2009/11/11/302019.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/302019.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/302019.html原文地址åQšhttp://jhyimu2005.javaeye.com/blog/514379
先声明一下我用的框架是Spring + Hibernate + SpringMVC 数据库ä‹É用的是Oracle
昨天遇到了一个特诡异的问题就是我使用Oracle序列åQŒæŠŠä¸»é”®çš„计æ•îCº¤¾l™Hibernate处理åQ? 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<Experiment> 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; }


写完部çÖv什么都没问题,可当我写了测试类˜q›è¡Œ‹¹‹è¯•时发çŽîC¸»é”®çš„初始值竟然是50åQŒå…¶æ­¥é•¿äº¦æ˜¯50åQŒåœ¨åŒäº‹çš„帮助下发现原来是Hibernate在做é¬û|¼Œ@SequenceGenerator中添加两个参æ•?span style="color: red">åQˆallocationSize = 1, initialValue = 1åQ?/span>ž®±O(ji¨¡n)K。通过查找Hibernateçš„èµ„æ–™å‘çŽ°åŽŸæ¥æ˜¯å› äØ“allocationSize的默认值是50.具体请参考http://www.oracle.com/technology/global/cn/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#SequenceGenerator

只需要增加allocationSize = 1ž®±å¯ä»?/span>



Eric.Zhou 2009-11-11 21:54 发表评论
]]>
AbstractTransactionalJUnit4SpringContextTests中的事务回滚http://www.aygfsteel.com/rain1102/archive/2009/11/04/301147.htmlEric.ZhouEric.ZhouWed, 04 Nov 2009 12:58:00 GMThttp://www.aygfsteel.com/rain1102/archive/2009/11/04/301147.htmlhttp://www.aygfsteel.com/rain1102/comments/301147.htmlhttp://www.aygfsteel.com/rain1102/archive/2009/11/04/301147.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/301147.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/301147.html 当前有一个User和一个RoleåQŒå®ƒä»¬æ˜¯å¤šå¯¹å¤šå…³¾p»ï¼Œä¸­é—´è¡¨äØ“user_role存放userå’Œroleçš„id。部分User代码如下åQ?br /> @ManyToMany(cascade = { CascadeType.PERSIST }, fetch = FetchType.LAZY)   
    @JoinTable(name = "user_role",
      joinColumns = @JoinColumn(name = "user_id"),
      inverseJoinColumns = @JoinColumn(name = "role_id"))    

 public Set<Role> getRoles() {
  return roles;
 }
 
 public void setRoles(Set<Role> roles) {
  this.roles = roles;
 }
 
 public void addRole(Role role) {
  if (!this.roles.contains(role)) {
   this.roles.add(role);
  }
 }
 
 public void removeRole(Role role) {
  this.roles.remove(role);
 }

Role中的部分代码如下åQ?br /> @ManyToMany(
   cascade = {CascadeType.PERSIST, CascadeType.MERGE},
   mappedBy = "roles",
   targetEntity = User.class
   )

 public Set<User> getUsers() {
  return users;
 }

而测试代码ç‘ô承了AbstractTransactionalJUnit4SpringContextTestsåQŒä»£ç å¦‚下:
 @Test
 public void testManyToMany() {
  Role oneRole = new Role();
  oneRole.setDescription("manager");
  oneRole.setEnabled(true);
  oneRole.setRoleName("manger");
  
  Role twoRole = new Role();
  twoRole.setDescription("waitress");
  twoRole.setEnabled(true);
  twoRole.setRoleName("waitress");
  
  User user = new User();
  user.setEnabled(true);
  user.setPassword("jianghaiying");
  user.setUsername("Jiang HaiYing");
  user.addRole(oneRole);
  user.addRole(twoRole);
  userDAO.persist(user);
  
  try {
   userDAO.getConnection().commit();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
˜q™æ ·æ‰§è¡Œä»¥åŽåQŒæ‰“印出的信息如下:
Hibernate: insert into user (enabled, password, username) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)

˜q™æ—¶å€™é—®é¢˜å‡ºæ¥äº†åQŒäؓ什么没有往关系表中插入数据åQ?br /> 其实˜q™åƈ不是代码或者配¾|®å†™é”™è¯¯äº†ï¼Œåœ¨æ­£å¼è¿è¡Œä»£ç ä¸€åˆ‡æ­£å¸¸ï¼Œè€Œæ˜¯AbstractTransactionalJUnit4SpringContextTests出的é¬û|¼Œäº‹å®žä¸Šå¤šå¯¹å¤šå…Œ™”关系是由HibernateåŽÕd¸®æˆ‘们¾l´æŠ¤çš„,而AbstractTransactionalJUnit4SpringContextTestsä¸ÞZº†ä¿æŒæ•°æ®çš„æ¸…‹zåˆä¼šè‡ªåŠ¨å›žæ»šã€‚å¦‚ä½•è§£å†Œ™¿™ä¸ªé—®é¢˜å‘¢åQ?br /> æ–ÒŽ(gu¨©)³•åQ?br /> 只需要在testæ–ÒŽ(gu¨©)³•上添åŠ?span style="color: #008000">@Rollback(false)åQ?/span>ä¸è®©å®ƒå›žæ»šï¼Œä¸€åˆ‡æ­£å¸æ€º†ã€‚这时候也可以åŽÀLމtry语句了ã€?br /> Hibernate: insert into user (enabled, password, username) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into role (description, enabled, name) values (?, ?, ?)
Hibernate: insert into user_role (user_id, role_id) values (?, ?)
Hibernate: insert into user_role (user_id, role_id) values (?, ?)

Eric.Zhou 2009-11-04 20:58 发表评论
]]>
Hibernate 参数讄¡½®ä¸€è§ˆè¡¨[转蝲]http://www.aygfsteel.com/rain1102/archive/2009/06/12/281873.htmlEric.ZhouEric.ZhouFri, 12 Jun 2009 09:02:00 GMThttp://www.aygfsteel.com/rain1102/archive/2009/06/12/281873.htmlhttp://www.aygfsteel.com/rain1102/comments/281873.htmlhttp://www.aygfsteel.com/rain1102/archive/2009/06/12/281873.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/281873.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/281873.html属性名   用é€?nbsp; 

hibernate.dialect   一个Hibernate Dialect¾cÕdå…è®¸Hibernate针对特定的关¾pÀL•°æ®åº“生成优化的SQL. 取值full.classname.of.Dialect

hibernate.show_sql   输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL˜q™ä¸ªlog categoryè®¾äØ“debugã€?eg.true | false

hibernate.format_sql   在logå’Œconsole中打印出更漂亮的SQLã€?取值true | false

hibernate.default_schema   在生成的SQLä¸? ž®†ç»™å®šçš„schema/tablespace附加于非全限定名的表名上. 取值SCHEMA_NAME

hibernate.default_catalog   在生成的SQLä¸? ž®†ç»™å®šçš„catalog附加于非全限定名的表名上. 取值CATALOG_NAME

hibernate.session_factory_name   SessionFactory 创徏后,ž®†è‡ªåЍä‹É用这个名字绑定到JNDIä¸? 取值jndi/composite/name

hibernate.max_fetch_depth   为单向关è?一对一, 多对一)的外˜qžæŽ¥æŠ“取åQˆouter join fetchåQ‰æ ‘(w¨¨i)讄¡½®æœ€å¤§æ·±åº? å€égØ“0意味着ž®†å…³é—­é»˜è®¤çš„外连接抓å? 取å€?廸™®®åœ?åˆ?之间取å€?nbsp; 

hibernate.default_batch_fetch_size   为Hibernateå…Œ™”的批量抓取设¾|®é»˜è®¤æ•°é‡? 取å€?廸™®®çš„取å€égØ“4, 8, å’?6

hibernate.default_entity_mode   为由˜q™ä¸ªSessionFactory打开的所有Session指定默认的实体表现模å¼? 取值dynamic-map, dom4j, pojo

hibernate.order_updates   强制Hibernate按照被更新数据的主键åQŒäØ“SQL更新排序。这么做ž®†å‡ž®‘åœ¨é«˜åÆˆå‘ç³»¾lŸä¸­äº‹åŠ¡çš„æ­»é”ã€?取值true | false

hibernate.generate_statistics   如果开å? Hibernatež®†æ”¶é›†æœ‰åŠ©äºŽæ€§èƒ½è°ƒèŠ‚çš„ç»Ÿè®¡æ•°æ? 取值true | false

hibernate.use_identifer_rollback   如果开å? åœ¨å¯¹è±¡è¢«åˆ é™¤æ—¶ç”Ÿæˆçš„æ ‡è¯†å±žæ€§å°†è¢«é‡è®¾äØ“é»˜è®¤å€? 取值true | false

hibernate.use_sql_comments   如果开å? Hibernatež®†åœ¨SQL中生成有助于调试的注释信æ? 默认å€égØ“false. 取值true | false

è¡?3.4.   Hibernate JDBC和连æŽ?connection)属æ€?/p>

属性名   用é€?nbsp; 

hibernate.jdbc.fetch_size   非零å€û|¼ŒæŒ‡å®šJDBC抓取数量的大ž®?(调用Statement.setFetchSize()).  

hibernate.jdbc.batch_size   非零å€û|¼Œå…è®¸Hibernate使用JDBC2的批量更æ–? 取å€?廸™®®å?åˆ?0之间的å€?nbsp; 

hibernate.jdbc.batch_versioned_data   如果你想让你的JDBC驱动从executeBatch()˜q”回正确的行计数 , 那么ž®†æ­¤å±žæ€§è®¾ä¸ºtrue(开启这个选项通常是安全的). 同时åQŒHibernatež®†äؓ自动版本化的数据使用扚w‡DML. 默认å€égØ“false. eg.true | false

hibernate.jdbc.factory_class   选择一个自定义的Batcher. 多数应用½E‹åºä¸éœ€è¦è¿™ä¸ªé…¾|®å±žæ€? eg.classname.of.Batcher

hibernate.jdbc.use_scrollable_resultset   允许Hibernate使用JDBC2的可滚动¾l“æžœé›? 只有在ä‹É用用æˆähä¾›çš„JDBC˜qžæŽ¥æ—Óž¼Œ˜q™ä¸ªé€‰é¡¹æ‰æ˜¯å¿…要çš? 否则Hibernate会ä‹É用连接的元数æ? 取值true | false

hibernate.jdbc.use_streams_for_binary   在JDBCè¯Õd†™binary (二进åˆ?或serializable (可序列化) 的类型时使用‹¹?stream)(¾pȝ»Ÿ¾U§å±žæ€?. 取值true | false

hibernate.jdbc.use_get_generated_keys   在数据插入数据库之后åQŒå…è®æ€‹É用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(é”?。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器旉™‡åˆ°é—®é¢˜ï¼Œè¯·å°†æ­¤å€ÆD®¾ä¸ºfalse. 默认情况下将使用˜qžæŽ¥çš„元数据来判定驱动的能力. 取值true|false

hibernate.connection.provider_class   自定义ConnectionProvider的类å? 此类用来向Hibernate提供JDBC˜qžæŽ¥. 取值classname.of.ConnectionProvider

hibernate.connection.isolation   讄¡½®JDBC事务隔离¾U§åˆ«. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离¾U§åˆ«. 取å€?, 2, 4, 8

hibernate.connection.autocommit   允许被缓存的JDBC˜qžæŽ¥å¼€å¯è‡ªåŠ¨æäº?autocommit) (不徏è®?. 取值true | false

hibernate.connection.release_mode   指定Hibernate在何旉™‡Šæ”¾JDBC˜qžæŽ¥. 默认情况ä¸?直到Session被显式关闭或被断开˜qžæŽ¥æ—?才会释放JDBC˜qžæŽ¥. 对于应用½E‹åºæœåŠ¡å™¨çš„JTA数据æº? 你应当ä‹É用after_statement, ˜q™æ ·åœ¨æ¯‹Æ¡JDBC调用后,都会ä¸ÕdŠ¨çš„é‡Šæ”¾è¿žæŽ? 对于非JTA的连æŽ? 使用after_transaction在每个事务结束时释放˜qžæŽ¥æ˜¯åˆç†çš„. autož®†äØ“JTAå’ŒCMT事务½{–略选择after_statement, 为JDBC事务½{–略选择after_transaction. 取值on_close | after_transaction | after_statement | auto

hibernate.connection.<propertyName>   ž®†JDBC属性propertyName传递到DriverManager.getConnection()中去.  

hibernate.jndi.<propertyName>   ž®†å±žæ€§propertyName传递到JNDI InitialContextFactory中去.  

è¡?3.5.   Hibernate¾~“存属æ€?/p>

属性名   用é€?nbsp; 

hibernate.cache.provider_class   自定义的CacheProvider的类å? 取值classname.of.CacheProvider

hibernate.cache.use_minimal_puts   以频¾Jçš„è¯ÀL“ä½œäؓ代ä­h(hu¨¢n), 优化二çñ”¾~“存来最ž®åŒ–写操ä½? 在Hibernate3中,˜q™ä¸ªè®„¡½®å¯¹çš„集群¾~“存非常有用, 寚w›†¾Ÿ¤ç¼“存的实现而言åQŒé»˜è®¤æ˜¯å¼€å¯çš„. 取值true|false

hibernate.cache.use_query_cache   允许查询¾~“å­˜, 个别查询仍然需要被讄¡½®ä¸ºå¯¾~“å­˜çš? 取值true|false

hibernate.cache.use_second_level_cache   能用来完全禁止ä‹É用二¾U§ç¼“å­? 寚w‚£äº›åœ¨¾cÈš„æ˜ å°„定义中指å®?lt;cache>的类åQŒä¼šé»˜è®¤å¼€å¯äºŒ¾U§ç¼“å­? 取值true|false

hibernate.cache.query_cache_factory   自定义实现QueryCache接口的类å? 默认为内建的StandardQueryCache. 取值classname.of.QueryCache

hibernate.cache.region_prefix   二çñ”¾~“存区域名的前缀. 取值prefix

hibernate.cache.use_structured_entries   强制Hibernate以更人性化的格式将数据存入二çñ”¾~“å­˜. 取值true|false

è¡?3.6.   Hibernate事务属æ€?/p>

属性名   用é€?nbsp; 

hibernate.transaction.factory_class   一个TransactionFactory的类å? 用于Hibernate Transaction API (默认为JDBCTransactionFactory). 取值classname.of.TransactionFactory

jta.UserTransaction   一个JNDI名字åQŒè¢«JTATransactionFactory用来从应用服务器获取JTA UserTransaction. 取值jndi/composite/name

hibernate.transaction.manager_lookup_class   一个TransactionManagerLookup的类å?- 当ä‹É用JVM¾U§ç¼“存,或在JTA环境中ä‹É用hilo生成器的时候需要该¾c? 取值classname.of.TransactionManagerLookup

hibernate.transaction.flush_before_completion   如果开å? session在事务完成后ž®†è¢«è‡ªåŠ¨æ¸…æ´—(flush)ã€?现在更好的方法是使用自动session上下文管理。取值true | false

hibernate.transaction.auto_close_session   如果开å? session在事务完成后ž®†è¢«è‡ªåЍ关闭ã€?现在更好的方法是使用自动session上下文管理。取值true | false

è¡?3.7.   其他属æ€?/p>

属性名   用é€?nbsp; 

hibernate.current_session_context_class   ä¸?当前" Session指定一ä¸?自定义的)½{–略。eg.jta | thread | custom.Class

hibernate.query.factory_class   选择HQL解析器的实现. 取值org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory

hibernate.query.substitutions   ž®†Hibernate查询中的½W¦å·æ˜ å°„到SQL查询中的½W¦å· (½W¦å·å¯èƒ½æ˜¯å‡½æ•°åæˆ–常量名å­?. 取值hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC

hibernate.hbm2ddl.auto   在SessionFactory创徏æ—Óž¼Œè‡ªåЍ‹‚€æŸ¥æ•°æ®åº“¾l“æž„åQŒæˆ–者将数据库schemaçš„DDL导出到数据库. 使用 create-dropæ—?在显式关闭SessionFactoryæ—Óž¼Œž®†drop掉数据库schema. 取值validate | update | create | create-drop

hibernate.cglib.use_reflection_optimizer   开启CGLIB来替代运行时反射机制(¾pȝ»Ÿ¾U§å±žæ€?. 反射机制有时在除错时比较有用. 注意即ä‹É关闭˜q™ä¸ªä¼˜åŒ–, Hibernate˜q˜æ˜¯éœ€è¦CGLIB. 你不能在hibernate.cfg.xml中设¾|®æ­¤å±žæ€? 取值true | false

3.4.1.   SQL方言 你应当æ€ÀL˜¯ä¸ÞZ½ çš„æ•°æ®åº“ž®†hibernate.dialect属性设¾|®æˆæ­£ç¡®çš?org.hibernate.dialect.Dialect子类. 如果你指定一¿Uæ–¹­a€, Hibernatež®†äؓ上面列出的一些属性ä‹É用合理的默认å€? ä¸ÞZ½ çœåŽ»äº†æ‰‹å·¥æŒ‡å®šå®ƒä»¬çš„åŠŸå¤«.

è¡?3.8.   Hibernate SQL方言 (hibernate.dialect)

RDBMS 方言  

DB2 org.hibernate.dialect.DB2Dialect  

DB2 AS/400 org.hibernate.dialect.DB2400Dialect  

DB2 OS390 org.hibernate.dialect.DB2390Dialect  

PostgreSQL org.hibernate.dialect.PostgreSQLDialect  

MySQL org.hibernate.dialect.MySQLDialect  

MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect  

MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect  

Oracle (any version) org.hibernate.dialect.OracleDialect  

Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect  

Sybase org.hibernate.dialect.SybaseDialect  

Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect  

Microsoft SQL Server org.hibernate.dialect.SQLServerDialect  

SAP DB org.hibernate.dialect.SAPDBDialect  

Informix org.hibernate.dialect.InformixDialect  

HypersonicSQL org.hibernate.dialect.HSQLDialect  

Ingres org.hibernate.dialect.IngresDialect  

Progress org.hibernate.dialect.ProgressDialect  

Mckoi SQL org.hibernate.dialect.MckoiDialect  

Interbase org.hibernate.dialect.InterbaseDialect  

Pointbase org.hibernate.dialect.PointbaseDialect  

FrontBase org.hibernate.dialect.FrontbaseDialect  

Firebird org.hibernate.dialect.FirebirdDialect  

è¡?3.9.   Hibernate日志¾cÕdˆ«

¾cÕdˆ«   功能  

org.hibernate.SQL   在所有SQL DML语句被执行时为它们记录日å¿?nbsp; 

org.hibernate.type   为所有JDBC参数记录日志  

org.hibernate.tool.hbm2ddl   在所有SQL DDLè¯­å¥æ‰§è¡Œæ—¶äØ“å®ƒä»¬è®°å½•æ—¥å¿—  

org.hibernate.pretty   在session清洗(flush)æ—Óž¼Œä¸ºæ‰€æœ‰ä¸Žå…¶å…³è”的实体(最å¤?0ä¸?的状态记录日å¿?nbsp; 

org.hibernate.cache   为所有二¾U§ç¼“存的‹zÕdŠ¨è®°å½•æ—¥å¿—  

org.hibernate.transaction   ä¸ÞZº‹åŠ¡ç›¸å…³çš„‹zÕdŠ¨è®°å½•æ—¥å¿—  

org.hibernate.jdbc   为所有JDBC资源的获取记录日å¿?nbsp; 

org.hibernate.hql.AST   在解析查询的时å€?记录HQLå’ŒSQLçš„AST分析日志  

org.hibernate.secure   为JAAS认证è¯äh±‚做日å¿?nbsp; 

org.hibernate   ä¸ÞZ“Q何Hibernate相关信息做日å¿?(信息量较å¤? 但对查错非常有帮åŠ?  

è¡?3.10. JTA TransactionManagers

Transaction工厂¾c?nbsp;  应用½E‹åºæœåŠ¡å™?nbsp; 

org.hibernate.transaction.JBossTransactionManagerLookup   JBoss

org.hibernate.transaction.WeblogicTransactionManagerLookup   Weblogic

org.hibernate.transaction.WebSphereTransactionManagerLookup   WebSphere

org.hibernate.transaction.WebSphereExtendedJTATransactionLookup   WebSphere 6

org.hibernate.transaction.OrionTransactionManagerLookup   Orion

org.hibernate.transaction.ResinTransactionManagerLookup   Resin

org.hibernate.transaction.JOTMTransactionManagerLookup   JOTM

org.hibernate.transaction.JOnASTransactionManagerLookup   JOnAS

org.hibernate.transaction.JRun4TransactionManagerLookup   JRun4

org.hibernate.transaction.BESTransactionManagerLookup   Borland ES



Eric.Zhou 2009-06-12 17:02 发表评论
]]>
Hibernate中的回调与拦截机制[转蝲]http://www.aygfsteel.com/rain1102/archive/2009/06/11/281513.htmlEric.ZhouEric.ZhouThu, 11 Jun 2009 08:49:00 GMThttp://www.aygfsteel.com/rain1102/archive/2009/06/11/281513.htmlhttp://www.aygfsteel.com/rain1102/comments/281513.htmlhttp://www.aygfsteel.com/rain1102/archive/2009/06/11/281513.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/281513.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/281513.html在某些情况下åQŒæˆ‘们需要对实体çš?/span>CURD操作˜q›è¡Œæ•获òq¶æ‰§è¡Œä¸€äº›æ“ä½œï¼Œ˜q™å¯ä»¥é€šè¿‡æ•°æ®åº“触发器来实玎ͼŒä½†æ˜¯æ­£å¦‚我们上一节中所分析的,ç”׃ºŽè§¦å‘器的执行å¯?/span>Hibernate Sessionæ˜¯é€æ˜Žçš„ï¼Œå› æ­¤ä¼šå¸¦æ¥å¾ˆå¤šé—®é¢˜ï¼ˆå‚è§ä¸Šä¸€èŠ‚ï¼‰ã€‚äØ“æ­?/span>Hibernate提供了一些专门用于捕èŽïL(f¨¥ng)›‘听实ä½?/span>CURD操作的接口,通过˜q™äº›æŽ¥å£å¯ä»¥å®žçް¾cÖM¼¼è§¦å‘器的功能åQŒèƒ½å¤Ÿåœ¨å®žä½“发生CURD操作时捕获事ä»Óž¼Œòq¶ä¸”执行相应的动作逻辑。在Hibernate中这些接口是åQ?/span>Lifecycle,Validatable,Interceptor,下面我们ž®±åˆ†åˆ«è®²è§£æ€Žæ ·é€šè¿‡˜q™äº›æŽ¥å£åQŒå®žçŽ°å›žè°ƒæ‹¦æˆªçš„æŠ€æœ¯ç»†èŠ‚ã€?/span>

A�/span>Lifecycle�/span>Validatable

 åœ?/span>Hibernateä¸?/span>Lifecycle接口定义如下åQ?/span>

public interface Lifecycle{

 /**

   在实体对象执è¡?/span>save/insert操作之前触发

 **/

 public boolean onSave(Session session) throws CallbackException;

 /**

   åœ?/span>session.update()执行之前触发

 **/

 public boolean onUpdate(Session session) throws CallbackException;

 /**

 åœ¨å®žä½“对象执è¡?/span>delete操作之前触发

**/

public boolean onDelete(Session session) throws CallbackException;

/**

 åœ¨å®žä½“对象加载之后触å?/span>

**/

public void onLoad(Session session) throws CallbackException;

}

实体对象可以实现Lifecycle接口åQŒæ¥èŽ·å¾—åœ¨æŒä¹…åŒ–é˜¶æ®µæ•èŽ·CURD事äšgåQŒåƈ执行相应动作的能如下所½Cºï¼š

public class User implements Serializable,Lifecycle{

 public boolean onSave(Session s) throws CallbackException{

……

return false;

……

 }

 public boolean onUpdate(Session s) throws CallbackException{

……

return true;

……

 }

 public boolean onDelete(Session s) throws CallbackException{

……

return false;

……

 }

 public boolean onLoad(Session s) throws CallbackException{

……

 }

}

对于onSave,onUpdate,onDeleteæ–ÒŽ(gu¨©)³•åQŒå¦‚果返å›?/span>true则意味着需要终止执行对应的操作˜q‡ç¨‹ã€‚如果在˜qè¡Œæ—¶æŠ›å‡?/span>CallbackExceptionåQŒå¯¹åº”的操作也会被终止ã€?/span>

注意在接口中对应的方法中åQŒä¸è¦åŽ»é€šè¿‡æ–ÒŽ(gu¨©)³•çš?/span>Session参数执行持久化操作,在这些方法中Session无法正常使用åQŒå¦‚果必™å»è¦æ‰§è¡Œä¸€äº›æŒä¹…化操作åQŒé‚£ä¹ˆéœ€è¦è¿›è¡Œç‰¹ŒDŠçš„处理åQŒæˆ‘们将åœ?/span>Interceptor部分详细讲解ã€?/span>

Hibernate中还定义äº?/span>Validatable接口åQŒè¯¥æŽ¥å£å®šä¹‰å¦‚下åQ?/span>

public interface Validatable{

 public void validate() throws ValidationFailure;

}

Validatable接口是用来实现数据验证的åQŒå®žä½“类实现Validatable接口åQŒåƈ在接口的validateæ–ÒŽ(gu¨©)³•中实现数据验证逻辑åQŒä»¥ä¿è¯æ•°æ®è¾“入的合法性ã€?/span>validateæ–ÒŽ(gu¨©)³•ž®†ä¼šåœ¨å®žä½“对象持久化前得到调用进行数据验证,ä¸?/span>Lifecycle接口中的æ–ÒŽ(gu¨©)³•不同åQ?/span>Validatable.validate()æ–ÒŽ(gu¨©)³•在实体生命周期中可能被多‹Æ¡è°ƒç”¨ï¼Œå› æ­¤æ­¤æ–¹æ³•应该仅限于数据合法性的验证åQŒè€Œä¸åº”该实现业务逻辑的验证ã€?/span>

B�/span>Interceptor:

以上æ˜?/span>Hibernate提供çš?/span>Lifecycle接口å’?/span>Validatable接口åQŒä»¥åŠä‹É用方法,˜q™ä¸¤ä¸ªæ–¹æ³•定义了一¿Uè‡ªç„¶çš„回调机制åQŒä½†æ˜¯å¦‚我们所见,如果惛_®žçŽ°å¯¹å®žä½“çš„å›žè°ƒæ‹¦æˆªï¼Œé‚£ä¹ˆç›¸åº”çš„å®žä½“å¯¹è±¡å¿…™åÕd®žçŽ°è¿™ä¸¤ä¸ªHibernate原生接口åQŒè¿™ž®×ƒ‹É代码的可¿UÀL¤æ€§å¤§å¤§ä¸‹é™ï¼Œå› äؓ此时实体¾cÕd·²¾lä¸å†æ˜¯ä¸€ä¸?/span>POJO了,Hibernate的那些天才的设计者们也已¾læ„è¯†åˆ°äº†è¿™ä¸ªé—®é¢˜ï¼Œæ‰€ä»¥åˆæä¾›äº?/span>Interceptor接口åQŒäؓ持久化事件的捕获和处理提供了一个非入äçR性的解决æ–ÒŽ(gu¨©)¡ˆåQ?/span>Interceptor接口通过讄¡½®æ³¨å…¥æ¥å®žçŽ°æŒä¹…åŒ–äº‹äšg的捕获和处理åQŒè¿™æ˜¯å…¸åž‹çš„IOCåQˆæŽ§åˆ¶åè½¬ï¼‰è®¾è®¡æ€æƒ³ã€‚下面我们就讲解Interceptor接口的技术细节和使用æ–ÒŽ(gu¨©)³•ã€?/span>

Hibernate中的Interceptor接口定义如下åQ?/span>

public interface Interceptor{

 //对象初始化之前调用,˜q™æ—¶å®žä½“å¯¹è±¡åˆšåˆšè¢«åˆ›å»ºï¼Œå„ä¸ªå±žæ€§è¿˜éƒ½äØ“null,如果在这个方法中修改了实体对象的数据åQŒé‚£ä¹ˆè¿”å›?/span>trueåQŒå¦åˆ™è¿”å›?/span>null.

 public boolean onLoad(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

      //Session.flush()在进行脏数据‹‚€æŸ¥æ—¶åQŒå¦‚果发现实体对象数据已脏,ž®Þp°ƒç”¨æ­¤æ–ÒŽ(gu¨©)³•

 public boolean onFlushDirty(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

 //实体对象被保存前调用åQŒå¦‚果在˜q™ä¸ªæ–ÒŽ(gu¨©)³•中修改了实体对象的数据,那么˜q”回trueåQŒå¦åˆ™è¿”å›?/span>null.

 public boolean onSave(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

     //通过Session删除一个实体对象前调用

 public boolean onDelete(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

     //Session执行flush()之前调用

public boolean preFlush(Iterator entities) throws CallbackException;

     //Session执行flush()之后åQŒæ‰€æœ‰çš„SQL语句都执行完毕后调用

public boolean postFlush(Iterator entities) throws CallbackException;

     //当执è¡?/span>saveOrUpdateæ–ÒŽ(gu¨©)³•时调用,判断实体对象是否已经保存

     public Boolean isUnsaved(Object entity);

     //执行Session.flush()æ–ÒŽ(gu¨©)³•æ—Óž¼Œè°ƒç”¨æ­¤æ–¹æ³•åˆ¤æ–­è¯¥å¯¹è±¡æ˜¯å¦ä¸ø™„å¯¹è±¡åQŒè¿™æä¾›äº†è„æ•°æ®‹‚€æŸ¥çš„另一个回调拦截机åˆ?/span>

public int[] findDirty(Object entity,Serializable id,Object[] state,

String[] propertyNames,Type[] types) throws CallbackException;

     //å½?/span>Session构造实体类实例前调用,如果˜q”回null,Hibernate会按照默认方式构造实体类对象实例

public Object findDirty(Class clazz,Serializable id) throws CallbackException;

}

Intercepter不需要实体对象来实现åQŒè€Œæ˜¯é€šè¿‡å¼€å‘äh员定义一个实çŽ?/span>Interceptor接口的类åQŒç„¶åŽåœ¨åˆ›å¾Hibernate Sessionæ—Óž¼Œé€šè¿‡ž®?/span>Interceptor对象讄¡½®˜q›æ‰€åˆ›å¾çš?/span>SessionåQŒè¿™æ ·é€šè¿‡˜q™ä¸ªSession来操作的实体对象åQŒå°±éƒ½ä¼šå…ähœ‰å¯ÒŽ(gu¨©)Œä¹…化动作的回调拦截能力。在Hibernateä¸?/span>Interceptor对象共有两种用法åQŒå¦‚下所˜qŽÍ¼š

1ã€?/span>                SessionFactory.openSession(Interceptor)åQšäؓ每个Session实例分配一个拦æˆ?/span>InterceptoråQŒè¿™ä¸ªæ‹¦æˆªæŽ¥å£å¯¹è±¡ï¼Œå­˜æ”¾åœ?/span>Session范围内,为每ä¸?/span>Session实例所专用ã€?/span>

2ã€?/span>                Configuration.setInterceptor(Interceptor):ä¸?/span>SessionFactory实例分配一ä¸?/span>Interceptor实例åQŒè¿™ä¸?/span>Interceptor实例存放åœ?/span>SessionFactory范围内,被每ä¸?/span>Session实例所å…׃ínã€?/span>

A�/span>Interceptor的典型应用:

下面我实çŽîC¸€ä¸ªåˆ©ç”?/span>Interceptor接口实现日志数据½E½æ ¸çš„åŠŸèƒ½ï¼Œæ‰€è°“æ—¥å¿—æ•°æ®ç¨½æ ¸å°±æ˜¯é’ˆå¯¹ä¸€äº›å…³é”®æ“ä½œè¿›è¡Œè®°å½•ï¼Œä»¥ä¾¿ä½œäØ“ä¸šåŠ¡è·Ÿè¸ªçš„åŸº¼‹€ä¾æ®ã€?/span>

首先定义用于记录操作的实体:

public class AudiLog implements Serializable{

 private String id;

 private String user;

 private String action;

 private String entityName;

 private String comment;

 private Long logtime;

 …getter/setter…

}

接下来定ä¹?/span>Interceptor接口的实现类和用于持久化操作çš?/span>AuditDAO¾c»ï¼š

package com.lbs.apps.unemployment.subsidy.beforeinfoimport.util;

import net.sf.hibernate.Session;

import net.sf.hibernate.Interceptor;

import Java.io.Serializable;

import net.sf.hibernate.type.Type;

import net.sf.hibernate.HibernateException;

import Java.util.Iterator;

import Java.util.Set;

import Java.util.HashSet;

import com.neusoft.entity.User;

public class MyInterceptor implements Interceptor{

 private Set insertset=new HashSet();

 private Set updateset=new HashSet();

 private Session session;

 private String userID;

 public void setSession(Session session){

    this.session=session

 �/span>

 public void setUserID(String id){

   this.userID=id;

 }

 public boolean onLoad(Object object, Serializable serializable,

                        Object[] objectArray, String[] stringArray,

                        Type[] typeArray) {

    return false;

 }

 public boolean onFlushDirty(Object object, Serializable serializable,

                              Object[] objectArray, Object[] objectArray3,

                              String[] stringArray, Type[] typeArray) {

    if(object instanceof User){

      insertset.add(object);

    }

    return false;

 }

 public boolean onSave(Object object, Serializable serializable,

                        Object[] objectArray, String[] stringArray,

                        Type[] typeArray) {

    if(object instanceof User){

      updateset.add(object);

    }

    return false;

 }

 public void onDelete(Object object, Serializable serializable,

                       Object[] objectArray, String[] stringArray,

                       Type[] typeArray) {

 }

 public void preFlush(Iterator iterator) {

 }

 public void postFlush(Iterator iterator) {

try{

 if(insertset.size()>0){

   AuditDAO.dolog(“insert”,userID,inserset,session.connection);

 }

 if(updateset.size()>0){

   AuditDAO.dolog(“update”,userID,updateset,session.connection);

 }

}catch(HibernateException he){

 he.printStackTrace();

}

 }

 public Boolean isUnsaved(Object object) {

    return null;

 }

 public int[] findDirty(Object object, Serializable serializable,

                         Object[] objectArray, Object[] objectArray3,

                         String[] stringArray, Type[] typeArray) {

    return null;

 }

 public Object instantiate(Class class0, Serializable serializable) {

    return "";

 }

}

public class AuditDAO{

 public static void doLog(String action,String userID,Set modifySet,Connection connection){

     Session tempsession=HibernateUtil.getSessionFactory().openSession(connection);

     try{

       Iterator it=modifyset.iterator();

       while(it.hasNext()){

         User user=(User)it.next();

         AudiLog log=new AudiLog();

         log.setUserID(userID);

         log.setAction(action);

         log.setComment(user.toString());

         log.setLogTime(new Long(Calendar.getInstance().getTime().getTime()));

         tempsession.save(log);

       }

     }catch(Exception e){

       throw new CallbackException(e);

     }finally{

       try{

         tempsesson.close();

       }catch(HibernateException he){

         throw new CallbackException(he);

       }

     }

 }

}

最后看一下业务逻辑ä¸È¨‹åºï¼š

SessionFactory sessionfactory=config.buildSessionFactory();

MyInterceptor it=new MyInterceptor();

session=sessionfactory().openSession(it);

it.setUserID(“currentUser”);

it.setSession(session);

User user=new User();

user.setName(“zx”);

Transaction tx=session.beginTransaction();

session.save(user);

tx.commit();

session.close();

以上½CÞZ¾‹ä»£ç ä¸­ï¼Œåœ¨åˆ›å»?/span>Sessionæ—Óž¼Œè®„¡½®Interceptor实例对象åQŒå½“执行åˆ?/span>session.save(user)前,会触å?/span>onSave()æ–ÒŽ(gu¨©)³•åQŒå½“执行tx.commit()æ—Óž¼Œä¼šæ‰§è¡?/span>flush()åQŒåœ¨æ‰§è¡Œè¯¥æ–¹æ³•后会触å?/span>postFlush()æ–ÒŽ(gu¨©)³•åQŒè¿™ä¸ªæ–¹æ³•通过AuditDAO˜q›è¡ŒæŒä¹…化保存业务日志,在这个类中的¾U¢è‰²éƒ¨åˆ†æ—¶æœ‰å…ÏxŒä¹…化操作部分åQŒæˆ‘ä»¬åÆˆæ²¡æœ‰ä½¿ç”¨åŽŸæœ‰çš?/span>Session实例åQŒè¿™æ˜¯å› ä¸ø™¦é¿å…Sessionå†…éƒ¨çŠ¶æ€æØœä¹±ï¼Œå› æ­¤æˆ‘ä»¬ä¾æ‰˜å½“å‰Sessionçš?/span>JDBC Connection创徏了一个äÍ(f¨´)æ—?/span>Session用于保存操作记录åQŒåœ¨˜q™ä¸ªæŒä¹…化操作中没有启动事务åQŒè¿™æ˜¯å› ä¸ÞZÍ(f¨´)æ—?/span>Session中的JDBC Connection是与外围调用Interceptorçš?/span>Sessionå…׃ín,而事务已¾låœ¨å¤–å›´Sessionçš?/span>JDBC Connection上启动。这是在拦截æ–ÒŽ(gu¨©)³•中进行持久化操作的标准方法。æ€ÖM¹‹Interceptor提供了非入äçR性的回调拦截机制åQŒä‹É我们可以方便而且优雅的实çŽîC¸€äº›æŒä¹…化操作的特ŒDŠéœ€æ±‚ã€?/span>

]]>
Interceptor中onFlushDirtyæ–ÒŽ(gu¨©)³•的参数previousState一直是½I?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/rain1102/archive/2009/06/05/280270.html</guid><wfw:comment>http://www.aygfsteel.com/rain1102/comments/280270.html</wfw:comment><comments>http://www.aygfsteel.com/rain1102/archive/2009/06/05/280270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/rain1102/comments/commentRss/280270.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/rain1102/services/trackbacks/280270.html</trackback:ping><description><![CDATA[Interceptor中onFlushDirtyæ–ÒŽ(gu¨©)³•的参数previousState一直是½I? ¾læ£€æŸ¥å‘现原来在更新对象的时候ä‹É用saveOrUpdateæ–ÒŽ(gu¨©)³•的缘æ•? 替换使用merge问题ž®Þp§£å†³äº†.<br /><img src ="http://www.aygfsteel.com/rain1102/aggbug/280270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/rain1102/" target="_blank">Eric.Zhou</a> 2009-06-05 20:58 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/rain1102/archive/2009/03/09/258670.html</guid><wfw:comment>http://www.aygfsteel.com/rain1102/comments/258670.html</wfw:comment><comments>http://www.aygfsteel.com/rain1102/archive/2009/03/09/258670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/rain1102/comments/commentRss/258670.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/rain1102/services/trackbacks/258670.html</trackback:ping><description><![CDATA[<p>Spring2.0.1以后的版本已¾læ”¯æŒé…¾|®å¤šæ•°æ®æºï¼Œòq¶ä¸”可以在运行的时候动态加载不同的数据源。通过¾l§æ‰¿AbstractRoutingDataSourcež®±å¯ä»¥å®žçŽ°å¤šæ•°æ®æºçš„åŠ¨æ€è{换。目前做的项目就是需要访é—?2个数据源åQŒæ¯ä¸ªæ•°æ®æºçš„表¾l“构都是相同的,所以要求数据源的变动对于编码äh员来说是透明åQŒä¹Ÿž®±æ˜¯è¯´åŒæ ·SQL语句在不同的环境下操作的数据库是不一æ ïL(f¨¥ng)š„。具体的配置如下åQ?<br /> 一、首先需要写一个静态的键值对照类åQ?/p> <p> <div>代码</div> <div> <div> <div></div> <ol> <li><span><span>package</span><span> cn.com.xinli.ccp.dynamicds;   </span></span> <li><span>  </span> <li><span>public</span><span> </span><span>class</span><span> DataSourceMap {   </span> <li><span>    </span><span>public</span><span> </span><span>static</span><span> </span><span>final</span><span> String Admin=</span><span>"Admin"</span><span>;   </span> <li><span>    </span><span>public</span><span> </span><span>static</span><span> </span><span>final</span><span> String Yxh = </span><span>"Yxh"</span><span>;   </span> <li><span>}  </span></li> </ol> </div> </div> <p> </p> <p> </p> <p> </p> <p>˜q™ä¸ª¾cÖM¸»è¦åœ¨ä½¿ç”¨çš„æ—¶å€™å½“作获得数据源的标志ä‹É用ã€?<br /> 二、徏立一个获得和讄¡½®ä¸Šä¸‹æ–‡çš„¾c»ï¼š <br /> <div>代码</div> <div> <div> <div></div> <ol> <li><span><span>package</span><span> cn.com.xinli.ccp.dynamicds;   </span></span> <li><span>  </span> <li><span>public</span><span> </span><span>class</span><span> CustomerContextHolder {   </span> <li><span>    </span><span>private</span><span> </span><span>static</span><span> </span><span>final</span><span> ThreadLocal contextHolder =    </span> <li><span>        </span><span>new</span><span> ThreadLocal();   </span> <li><span>       </span> <li><span>    </span><span>public</span><span> </span><span>static</span><span> </span><span>void</span><span> setCustomerType(String customerType) {   </span> <li><span>      contextHolder.set(customerType);   </span> <li><span>    }   </span> <li><span>       </span> <li><span>    </span><span>public</span><span> </span><span>static</span><span> String getCustomerType() {   </span> <li><span>      </span><span>return</span><span> (String) contextHolder.get();   </span> <li><span>    }   </span> <li><span>       </span> <li><span>    </span><span>public</span><span> </span><span>static</span><span> </span><span>void</span><span> clearCustomerType() {   </span> <li><span>      contextHolder.remove();   </span> <li><span>    }   </span> <li><span>  </span> <li><span>}  </span></li> </ol> </div> </div> <br /> ˜q™ä¸ªä¸»è¦è´Ÿè´£è®„¡½®ä¸Šä¸‹æ–‡çŽ¯å¢ƒå’ŒèŽ·å¾—ä¸Šä¸‹æ–‡çŽ¯å¢ƒã€?<br /> 三、徏立动态数据源¾c»ï¼Œ˜q™ä¸ª¾cÕd¿…™åȝ‘ô承AbstractRoutingDataSourceåQ?<br /> <div>代码</div> <div> <div> <div></div> <ol> <li><span><span>package</span><span> cn.com.xinli.ccp.dynamicds;   </span></span> <li><span>  </span> <li><span>import</span><span> org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;   </span> <li><span>  </span> <li><span>public</span><span> </span><span>class</span><span> DynamicDataSource </span><span>extends</span><span> AbstractRoutingDataSource {   </span> <li><span>  </span> <li><span>    </span><span>protected</span><span> Object determineCurrentLookupKey() {   </span> <li><span>        </span><span>// TODO Auto-generated method stub </span><span>  </span> <li><span>        </span><span>return</span><span> CustomerContextHolder.getCustomerType();   </span> <li><span>    }   </span> <li><span>  </span> <li><span>}  </span></li> </ol> </div> </div> <br /> ˜q™ä¸ª¾cÕd®žçŽîCº†determineCurrentLookupKeyæ–ÒŽ(gu¨©)³•åQŒè¯¥æ–ÒŽ(gu¨©)³•˜q”回一个ObjectåQŒä¸€èˆ¬æ˜¯˜q”回字符ä¸ÔŒ¼Œä¹Ÿå¯ä»¥æ˜¯æžšä‹D¾cÕdž‹ã€‚该æ–ÒŽ(gu¨©)³•中直接ä‹É用了CustomerContextHolder.getCustomerType()æ–ÒŽ(gu¨©)³•èŽ·å¾—ä¸Šä¸‹æ–‡çŽ¯å¢ƒåÆˆç›´æŽ¥˜q”回ã€?<br /> 四、编写spring的配¾|®æ–‡ä»‰™…¾|®æ•°æ®æº <br /> <div>代码</div> <div> <div> <div></div> <ol> <li><span><span><</span><span>bean</span><span> </span><span>id</span><span>=</span><span>"parentDataSource"</span><span>  </span></span> <li><span>            </span><span>class</span><span>=</span><span>"org.springframework.jdbc.datasource.DriverManagerDataSource"</span><span>></span><span>  </span> <li><span>            </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"driverClassName"</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>value</span><span>></span><span>COM.ibm.db2.jdbc.net.DB2Driver</span><span></</span><span>value</span><span>></span><span>  </span> <li><span>            </span><span></</span><span>property</span><span>></span><span>  </span> <li><span>            </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"url"</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>value</span><span>></span><span>jdbc:db2:127.0.0.1:TEST</span><span></</span><span>value</span><span>></span><span>  </span> <li><span>            </span><span></</span><span>property</span><span>></span><span>  </span> <li><span>    </span><span></</span><span>bean</span><span>></span><span>  </span> <li><span>       </span> <li><span>    </span><span><</span><span>bean</span><span> </span><span>id</span><span>=</span><span>"adminDataSource"</span><span> </span><span>parent</span><span>=</span><span>"parentDataSource"</span><span>></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"username"</span><span> </span><span>value</span><span>=</span><span>"admin"</span><span>/></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"password"</span><span> </span><span>value</span><span>=</span><span>"master997mb"</span><span>/></span><span>  </span> <li><span>    </span><span></</span><span>bean</span><span>></span><span>  </span> <li><span>       </span> <li><span>    </span><span><</span><span>bean</span><span> </span><span>id</span><span>=</span><span>"yxhDataSource"</span><span> </span><span>parent</span><span>=</span><span>"parentDataSource"</span><span>></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"username"</span><span> </span><span>value</span><span>=</span><span>"yxh"</span><span>/></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"password"</span><span> </span><span>value</span><span>=</span><span>"yxh"</span><span>/></span><span>  </span> <li><span>    </span><span></</span><span>bean</span><span>></span><span>  </span></li> </ol> </div> </div> <br /> 在这个配¾|®ä¸­å¯ä»¥çœ‹åˆ°é¦–先有个parentDataSourceåQŒè¿™ä¸ªä¸»è¦é…¾|®ä¸€äº›æ•°æ®æºçš„公用信息,™å¹ç›®ä¸­éƒ½æ˜¯é“¾æŽ¥DB2数据库;adminDataSourceå’ŒyxhDataSource是根据不同需要配¾|®çš„个性化信息åQŒä½†éƒ½å¿…™åÕdŠ parent属性,å€égØ“parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库,那么parentDataSourcež®±å¯ä»¥ä¸è¦äº†åQŒç›´æŽ¥é…¾|®ä¸¤ä¸ªä¸åŒçš„æ•°æ®æºé“¾æŽ¥å°±å¯ä»¥äº†ã€?<br /> 五、编写spring配置文äšg配置多数据源映射关系 <br /> <div>代码</div> <div> <div> <div></div> <ol> <li><span><span><</span><span>bean</span><span> </span><span>id</span><span>=</span><span>"dataSource"</span><span> </span><span>class</span><span>=</span><span>"cn.com.xinli.ccp.dynamicds.DynamicDataSource"</span><span>></span><span>  </span></span> <li><span>       </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"targetDataSources"</span><span>></span><span>  </span> <li><span>          </span><span><</span><span>map</span><span> </span><span>key-type</span><span>=</span><span>"<a title="Java爱好è€? href="http://www.aygfsteel.com/rain1102" >Java</a>.lang.String"</span><span>></span><span>  </span> <li><span>             </span><span><</span><span>entry</span><span> </span><span>key</span><span>=</span><span>"Yxh"</span><span> </span><span>value-ref</span><span>=</span><span>"yxhDataSource"</span><span>/></span><span>  </span> <li><span>          </span><span></</span><span>map</span><span>></span><span>  </span> <li><span>       </span><span></</span><span>property</span><span>></span><span>  </span> <li><span>       </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"defaultTargetDataSource"</span><span> </span><span>ref</span><span>=</span><span>"adminDataSource"</span><span>/></span><span>  </span> <li><span>    </span><span></</span><span>bean</span><span>></span><span>  </span></li> </ol> </div> </div> <br /> 在这个配¾|®ä¸­½W¬ä¸€ä¸ªproperty属性配¾|®ç›®æ ‡æ•°æ®æºåQ?lt;map key-type="<a title="Java爱好è€? href="http://www.aygfsteel.com/rain1102" >Java</a>.lang.String">中的key-type必须要和静态键值对照类DataSourceMap中的值的¾cÕdž‹ç›¸åŒåQ?lt;entry key="Yxh" value-ref="yxhDataSource"/>中key的值必™å»è¦å’Œé™æ€é”®å€¼å¯¹ç…§ç±»ä¸­çš„值相同,如果有多个å€û|¼Œå¯ä»¥é…ç½®å¤šä¸ª<entry>标签。第二个property属性配¾|®é»˜è®¤çš„æ•°æ®æºã€?<br /> 六、配¾|®hibernateã€?<br /> Hibernate的配¾|®å’Œæ™®é€šçš„hibernate、spring¾l“合的配¾|®ä¸€æ ?<br /> <div>代码</div> <div> <div> <div></div> <ol> <li><span><span><</span><span>bean</span><span> </span><span>id</span><span>=</span><span>"sessionFactory"</span><span>  </span></span> <li><span>        </span><span>class</span><span>=</span><span>"org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span>></span><span>  </span> <li><span>        </span><span><!-- to override, use the "SpringDatasourceConfig" snippet in your project --></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"dataSource"</span><span>></span><span>  </span> <li><span>            </span><span><</span><span>ref</span><span> </span><span>local</span><span>=</span><span>"dataSource"</span><span> </span><span>/></span><span>  </span> <li><span>        </span><span></</span><span>property</span><span>></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"mappingResources"</span><span>></span><span>  </span> <li><span>            </span><span><</span><span>list</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>value</span><span>></span><span>  </span> <li><span>                    cn/com/xinli/ccp/entity/User.hbm.xml   </span> <li><span>                </span><span></</span><span>value</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>value</span><span>></span><span>  </span> <li><span>                    cn/com/xinli/ccp/entity/Test.hbm.xml   </span> <li><span>                </span><span></</span><span>value</span><span>></span><span>  </span> <li><span>            </span><span></</span><span>list</span><span>></span><span>  </span> <li><span>        </span><span></</span><span>property</span><span>></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"hibernateProperties"</span><span>></span><span>  </span> <li><span>            </span><span><</span><span>props</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.dialect"</span><span>></span><span>  </span> <li><span>                    org.hibernate.dialect.DB2Dialect   </span> <li><span>                </span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                   </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.show_sql"</span><span>></span><span>true</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.use_outer_join"</span><span>></span><span>true</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.jdbc.batch_size"</span><span>></span><span>50</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.jdbc.fetch_size"</span><span>></span><span>5</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.connection.pool_size"</span><span>></span><span>2</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.connection.autocommit"</span><span>></span><span>false</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.cache.use_query_cache"</span><span>></span><span>false</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.max_fetch_depth"</span><span>></span><span>1</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>                </span><span><</span><span>prop</span><span> </span><span>key</span><span>=</span><span>"hibernate.bytecode.use_reflection_optimizer"</span><span>></span><span>true</span><span></</span><span>prop</span><span>></span><span>  </span> <li><span>            </span><span></</span><span>props</span><span>></span><span>  </span> <li><span>        </span><span></</span><span>property</span><span>></span><span>  </span> <li><span>    </span><span></</span><span>bean</span><span>></span><span>  </span> <li><span>  </span> <li><span><</span><span>bean</span><span> </span><span>id</span><span>=</span><span>"mydao"</span><span> </span><span>class</span><span>=</span><span>"cn.com.xinli.ccp.dao.HibernateBaseDao"</span><span>></span><span>  </span> <li><span>        </span><span><</span><span>property</span><span> </span><span>name</span><span>=</span><span>"sessionFactory"</span><span>></span><span>  </span> <li><span>            </span><span><</span><span>ref</span><span> </span><span>local</span><span>=</span><span>"sessionFactory"</span><span> </span><span>/></span><span>  </span> <li><span>        </span><span></</span><span>property</span><span>></span><span>  </span> <li><span>    </span><span></</span><span>bean</span><span>></span><span>  </span></li> </ol> </div> </div> <br /> 关于dao的代码这里就省略了ã€?<br /> 七、配¾|®ç»“束,可以使用了ã€?<br /> <div>代码</div> <div> <div> <div></div> <ol> <li><span><span>public</span><span> </span><span>class</span><span> DaoTest </span><span>extends</span><span> TestCase {   </span></span> <li><span>  </span> <li><span>    </span><span>public</span><span> </span><span>void</span><span> testSave() </span><span>throws</span><span> Exception{   </span> <li><span>        CustomerContextHolder.setCustomerType(DataSourceMap.Admin);</span><span>//讄¡½®æ•°æ®æº?</span><span>  </span> <li><span>        </span><span>//hibernate创徏实体 </span><span>  </span> <li><span>        Test test = </span><span>new</span><span> Test();   </span> <li><span>        test.setTest(</span><span>"22222222"</span><span>);   </span> <li><span>           </span> <li><span>        mydao.save(test);</span><span>//使用dao保存实体 </span><span>  </span> <li><span>           </span> <li><span>        CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);</span><span>//讄¡½®ä¸ºå¦ä¸€ä¸ªæ•°æ®æº </span><span>  </span> <li><span>           </span> <li><span>        mydao.save(test);</span><span>//使用dao保存实体到另一个库ä¸?</span><span>  </span> <li><span>           </span> <li><span>    }   </span> <li><span>}  </span></li> </ol> </div> </div> 在项目中对于¾~–码人员对多数据源的切换可以做成透明的,操作同样的daoåQŒå°±å¯ä»¥è®‰K—®ä¸åŒçš„æ•°æ®åº“了ã€?img src ="http://www.aygfsteel.com/rain1102/aggbug/258670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/rain1102/" target="_blank">Eric.Zhou</a> 2009-03-09 21:06 <a href="http://www.aygfsteel.com/rain1102/archive/2009/03/09/258670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HQL中ä‹É用in查询http://www.aygfsteel.com/rain1102/archive/2009/02/27/256987.htmlEric.ZhouEric.ZhouFri, 27 Feb 2009 05:10:00 GMThttp://www.aygfsteel.com/rain1102/archive/2009/02/27/256987.htmlhttp://www.aygfsteel.com/rain1102/comments/256987.htmlhttp://www.aygfsteel.com/rain1102/archive/2009/02/27/256987.html#Feedback2http://www.aygfsteel.com/rain1102/comments/commentRss/256987.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/256987.html structures = (List<ACD1Structure>) structureDAO.createQuery(hql).setParameterList("ids", cd_ids).list();

Eric.Zhou 2009-02-27 13:10 发表评论
]]>
Hibernateçš„createSQLQuery查询的小例子http://www.aygfsteel.com/rain1102/archive/2009/02/23/256344.htmlEric.ZhouEric.ZhouMon, 23 Feb 2009 13:26:00 GMThttp://www.aygfsteel.com/rain1102/archive/2009/02/23/256344.htmlhttp://www.aygfsteel.com/rain1102/comments/256344.htmlhttp://www.aygfsteel.com/rain1102/archive/2009/02/23/256344.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/256344.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/256344.html当我们用HQL˜q›è¡Œå­æŸ¥è¯¢çš„æ—¶å€™ï¼Œå¦‚select * from Tree where pid in (select id from TreeåQŒæ­¤æ—¶HIBERANTEž®×ƒ¼šæŠ¥é”™åQŒè¯´ä»€ä¹?号错误之¾cȝš„。但如果ž®?æ”¹äØ“Tree¾c»é‡Œçš„æ‰€æœ‰å­ŒD‰|—¶ž®×ƒ¸ä¼šæœ‰é—®é¢˜äº†ã€‚就会像òqÏx—¶ä¸€æ ïL(f¨¥ng)¬¬ä¸€è¡Œæ•°æ®è¿”回一个Object[]åQŒç„¶åŽä½ å†æ ¹æ®Tree¾c»é‡Œå­—段对Object[]æ•°ç»„é‡Œçš„å€ÆD¿›è¡Œè{换。这样一来比较麻烦。今天发现如果我SQL来查有一个方法可以返回一个对象的ã€?
Configuration config = new Configuration().configure();
SessionFactory sf     = config.buildSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Query query = session.createSQLQuery("select * from Tree t where pid in (select id from Tree) ").addEntity(Tree.class); //˜q”回对象
List  list = query.list(); 

此时在遍历list时就可以(Tree)list.get[i];ž®†æ¯ä¸€è¡Œçš„内容变换ä¸ÞZ¸€ä¸ªå¯¹è±¡äº†ã€?

另还可以˜q”回一个Map对象åQŒä¹Ÿž®±æ˜¯è¯´åœ¨åœ¨list里包含多个MapåQŒä»£ç å¦‚ä¸?
Query query = session.createSQLQuery("select id,name from Tree t where pid in (select id from Tree) ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //˜q”回一个map,KEY:为DB中名¿UîC¸€è‡ß_¼ˆå¤§å°å†™ä¸€è‡ß_¼‰éåކlist时就可以

Map map = (Map)list.get[i];

map.get("id");map.get("name");来取倹{€‚按你的SQL语句selectåŽçš„å­—æ®µåæ¥ä½œäØ“mapçš„KeyåQŒä½†˜q™ä¸ªkey必须与数据库中的字段名一模一栗÷€?


˜q˜å¯ä»¥ç”¨ä½œå‡½æ•°æ–¹é¢çš„。如
Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in (select id from Tree)
.addScalar("SUMID",Hibernate.INTEGER)  //转换¾cÕdž‹åQŒæŒ‰DB中的typeè½?br /> .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //˜q”回一个map,KEY:为DB中名¿UîC¸€è‡ß_¼ˆå¤§å°å†™ä¸€è‡ß_¼‰

直接ž®±map.get("SUMID")可以取å€égº†


˜q˜æœ‰ä¸€ç‚¹å°±æ˜¯è¿™ä¸ªæ–¹æ³•在Hibernate3.2版本上才能正常运行ã€?



Eric.Zhou 2009-02-23 21:26 发表评论
]]>
Hibernate Annotation中BLOB、CLOB注解写法http://www.aygfsteel.com/rain1102/archive/2009/02/10/254102.htmlEric.ZhouEric.ZhouTue, 10 Feb 2009 08:24:00 GMThttp://www.aygfsteel.com/rain1102/archive/2009/02/10/254102.htmlhttp://www.aygfsteel.com/rain1102/comments/254102.htmlhttp://www.aygfsteel.com/rain1102/archive/2009/02/10/254102.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/254102.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/254102.htmlåœ?/span>hibernate Annotation中,实体BLOBã€?/span>CLOB¾cÕdž‹çš„æ³¨è§£ä¸Žæ™®é€šçš„实体属性有些不同,具体操作如下åQ?/span>BLOB¾cÕdž‹åQŒç±»åž‹å£°æ˜ŽäØ“byte[]åQ?/span>

private byte[] contentåQ?/span>

   


注解åQ?/span>

@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "CONTENT", columnDefinition = "BLOB",nullable=true)
public byte[] getContent() { 
    return this.content;
}

public void setContent(byte[] content) { 
    this.content = content;
}

   











CLOB¾cÕdž‹åQŒç±»åž‹å£°æ˜ŽäØ“String卛_¯åQ?/span>

private String remarkåQ?/span>

   


注解åQ?/span>

@Lob
@Basic(fetch = FetchType.EAGER)
@Column(name="REMARK", columnDefinition="CLOB", nullable=true)
public String getRemark() { 
    return this.remark;
}

public void setRemark(String recvdocRemark) { 
    this.remark = remark;
}















]]>
[转] 常用 JPA annotation 参è€?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/rain1102/archive/2009/02/09/253913.html</guid><wfw:comment>http://www.aygfsteel.com/rain1102/comments/253913.html</wfw:comment><comments>http://www.aygfsteel.com/rain1102/archive/2009/02/09/253913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/rain1102/comments/commentRss/253913.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/rain1102/services/trackbacks/253913.html</trackback:ping><description><![CDATA[<p><strong>Table <br /> </strong>Table用来定义entity主表的nameåQŒcatalogåQŒschema½{‰å±žæ€§ã€?<br /> 元数据属性说明: <br /> · name: 表名 <br /> · catalog: 对应关系数据库中的catalog <br /> · schemaåQšå¯¹åº”å…³¾pÀL•°æ®åº“中的schema <br /> · UniqueConstraints:定义一个UniqueConstraint数组åQŒæŒ‡å®šéœ€è¦å¾å”¯ä¸€¾U¦æŸçš„列 <br />         <br /> @Entity<br /> @Table(name="CUST")<br /> public class Customer { ... }<br />   <br /> <strong>SecondaryTable</strong> <br /> 一个entity class可以映射到多表,SecondaryTable用来定义单个从表的名字,主键名字½{‰å±žæ€§ã€?<br /> 元数据属性说明: <br /> · name: 表名 <br /> · catalog: 对应关系数据库中的catalog <br /> · schemaåQšå¯¹åº”å…³¾pÀL•°æ®åº“中的schema <br /> · pkJoin: 定义一个PrimaryKeyJoinColumn数组åQŒæŒ‡å®šä»Žè¡¨çš„主键åˆ?<br /> · UniqueConstraints:定义一个UniqueConstraint数组åQŒæŒ‡å®šéœ€è¦å¾å”¯ä¸€¾U¦æŸçš„列 <br /> 下面的代码说明Customer¾cÀL˜ ž®„到两个表,主表名是CUSTOMERåQŒä»Žè¡¨åæ˜¯CUST_DETAILåQŒä»Žè¡¨çš„主键列和主表的主键列¾cÕdž‹ç›¸åŒåQŒåˆ—åäØ“CUST_IDã€?<br />         <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映射åˆîC¸€ä¸ªä¸»è¡¨å’Œå¤šä¸ªä»Žè¡¨æ—Óž¼Œç”¨SecondaryTables来定义各个从表的属性ã€?<br /> 元数据属性说明: <br /> · valueåQ?定义一个SecondaryTable数组åQŒæŒ‡å®šæ¯ä¸ªä»Žè¡¨çš„属性ã€?<br />         <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元数据里åQŒç”¨æ¥æŒ‡å®šå¾è¡¨æ—¶éœ€è¦å¾å”¯ä¸€¾U¦æŸçš„列ã€?<br /> 元数据属性说明: <br /> · columnNames:定义一个字½W¦ä¸²æ•°ç»„åQŒæŒ‡å®šè¦å»ºå”¯ä¸€¾U¦æŸçš„列名ã€?<br />         <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元数据定义了映射到数据库的列的所有属性:列名åQŒæ˜¯å¦å”¯ä¸€åQŒæ˜¯å¦å…è®æ€Ø“½Iºï¼Œæ˜¯å¦å…è®¸æ›´æ–°½{‰ã€?<br /> 元数据属性说明: <br /> · name:列名ã€?<br /> · unique: 是否唯一 <br /> · nullable: 是否允许为空 <br /> · insertable: 是否允许插入 <br /> · updatable: 是否允许更新 <br /> · columnDefinition: å®šä¹‰å»ø™¡¨æ—¶åˆ›å»ºæ­¤åˆ—çš„DDL <br /> · secondaryTable: 从表名。如果此列不建在主表上(默认建在主表åQ‰ï¼Œè¯¥å±žæ€§å®šä¹‰è¯¥åˆ—所在从表的名字ã€?<br />         <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上定义了关系åQˆone2one或one2many½{‰ï¼‰åQŒæˆ‘们通过JoinColumn来定义关¾pȝš„属性。JoinColumn的大部分属性和Column¾cÖM¼¼ã€?<br /> 元数据属性说明: <br /> · name:列名ã€?<br /> · referencedColumnName:该列指向列的列名åQˆå¾è¡¨æ—¶è¯¥åˆ—ä½œäØ“å¤–é”®åˆ—æŒ‡å‘å…³¾pÕd¦ä¸€ç«¯çš„æŒ‡å®šåˆ—) <br /> · unique: 是否唯一 <br /> · nullable: 是否允许为空 <br /> · insertable: 是否允许插入 <br /> · updatable: 是否允许更新 <br /> · columnDefinition: å®šä¹‰å»ø™¡¨æ—¶åˆ›å»ºæ­¤åˆ—çš„DDL <br /> · secondaryTable: 从表名。如果此列不建在主表上(默认建在主表åQ‰ï¼Œè¯¥å±žæ€§å®šä¹‰è¯¥åˆ—所在从表的名字ã€?<br /> 下面的代码说明Customå’ŒOrder是一对一关系。在Order对应的映ž®„表å»ÞZ¸€ä¸ªåä¸ºCUST_ID的列åQŒè¯¥åˆ—作为外键指向Customå¯¹åº”è¡¨ä¸­åäØ“ID的列ã€?<br />         <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上定义了关系åQˆone2one或one2many½{‰ï¼‰åQŒåƈ且关¾pÕd­˜åœ¨å¤šä¸ªJoinColumnåQŒç”¨JoinColumns定义多个JoinColumn的属性ã€?<br /> 元数据属性说明: <br /> · value: 定义JoinColumn数组åQŒæŒ‡å®šæ¯ä¸ªJoinColumn的属性ã€?<br /> 下面的代码说明Customå’ŒOrder是一对一关系。在Order对应的映ž®„表å»ÞZ¸¤åˆ—,一列名为CUST_IDåQŒè¯¥åˆ—作为外键指向Customå¯¹åº”è¡¨ä¸­åäØ“ID的列,另一列名为CUST_NAMEåQŒè¯¥åˆ—作为外键指向Customå¯¹åº”è¡¨ä¸­åäØ“NAME的列ã€?<br />         <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值的获取方式有五¿Uï¼šTABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracleå’ŒDB2支持SEQUENCEåQŒSQL Serverå’ŒSybase支持IDENTITY,mysql支持AUTO。所有的数据库都可以指定为AUTOåQŒæˆ‘们会æ ÒŽ(gu¨©)®ä¸åŒæ•°æ®åº“做转换。NONE (默认)需要用戯‚‡ªå·±æŒ‡å®šId的倹{€‚元数据属性说明: <br /> · generate():主键值的获取¾cÕdž‹ <br /> · generator():TableGenerator的名字(当generate=GeneratorType.TABLE才需要指定该属性) <br /> 下面的代码声明Task的主键列id是自动增长的ã€?Oracleå’ŒDB2从默认的SEQUENCE取å€û|¼ŒSQL Serverå’ŒSybase该列建成IDENTITYåQŒmysql该列建成auto incrementã€? <br />         <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å¿…é¡»½W¦åˆä»¥ä¸‹è¦æ±‚:¾cÕd¿…™åÕd£°æ˜ŽäØ“publicåQŒåÆˆæä¾›ä¸€ä¸ªå£°æ˜ŽäØ“public的空构造函数。必™åÕd®žçްSerializable接,覆写 equals()å’ŒhashCodeåQˆï¼‰æ–ÒŽ(gu¨©)³•。entity class的所有id field在id class都要定义åQŒä¸”¾cÕdž‹ä¸€æ —÷€?<br /> 元数据属性说明: <br /> · value: id class的类å?<br />    public class EmployeePK implements <a title="Java爱好è€? href="http://www.aygfsteel.com/rain1102">Java</a>.io.Serializable{<br />        String empName;<br />        Integer empAge;</p> <p>       public EmployeePK(){}<br />        public boolean equals(Object obj){ ......}<br />        public int hashCode(){......}<br />     }</p> <p>    @IdClass(value=com.acme.EmployeePK.class)<br />     @Entity(access=FIELD)<br />     public class Employee {<br />         @Id String empName;<br />         @Id Integer empAge;<br />     }<br />     <br />       <br /> <strong>MapKey</strong> <br /> 在一对多åQŒå¤šå¯¹å¤šå…³ç³»ä¸­ï¼Œæˆ‘们可以用Map来保存集合对象。默认用主键值做keyåQŒå¦‚æžœä‹É用复合主键,则用id class的实例做keyåQŒå¦‚果指定了name属性,ž®Þq”¨æŒ‡å®šçš„field的值做keyã€?<br /> 元数据属性说明: <br /> · name: 用来做keyçš„field名字 <br /> 下面的代码说明Personå’ŒBook之间是一对多关系。Personçš„books字段是Map¾cÕdž‹åQŒç”¨Bookçš„isbn字段的å€ég½œä¸ºMapçš„keyã€?<br />         </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>在一对多åQŒå¤šå¯¹å¤šå…³ç³»ä¸­ï¼Œæœ‰æ—¶æˆ‘们希望从数据库加蝲出来的集合对象是按一定方式排序的åQŒè¿™å¯ä»¥é€šè¿‡OrderBy来实玎ͼŒé»˜è®¤æ˜¯æŒ‰å¯¹è±¡çš„主键升序排列ã€?<br /> 元数据属性说明: <br /> · value: å­—ç¬¦ä¸²ç±»åž‹ï¼ŒæŒ‡å®šæŽ’åºæ–¹å¼ã€‚æ ¼å¼äØ“"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序¾cÕdž‹å¯ä»¥ä¸æŒ‡å®šï¼Œé»˜è®¤æ˜¯ASCã€?<br /> 下面的代码说明Personå’ŒBook之间是一对多关系。集合books按照Bookçš„isbn升序åQŒname降序排列ã€?<br />         </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 /> 在三¿Uæƒ…况下会用到PrimaryKeyJoinColumnã€?<br /> · ¾l§æ‰¿ã€?<br /> · entity class映射åˆîC¸€ä¸ªæˆ–多个从表。从表根据主表的主键列(列名为referencedColumnName值的列)åQŒå¾ç«‹ä¸€ä¸ªç±»åž‹ä¸€æ ïL(f¨¥ng)š„主键列,列名由name属性定义ã€?<br /> · one2one关系åQŒå…³¾pȝ»´æŠ¤ç«¯çš„主键作为外键指向关¾p»è¢«¾l´æŠ¤ç«¯çš„主键åQŒä¸å†æ–°å»ÞZ¸€ä¸ªå¤–键列ã€?<br /> 元数据属性说明: <br /> · name:列名ã€?<br /> · referencedColumnName:该列引用列的列名 <br /> · columnDefinition: å®šä¹‰å»ø™¡¨æ—¶åˆ›å»ºæ­¤åˆ—çš„DDL <br /> 下面的代码说明Customer映射åˆîC¸¤ä¸ªè¡¨åQŒä¸»è¡¨CUSTOMER,从表CUST_DETAILåQŒä»Žè¡¨éœ€è¦å¾ç«‹ä¸»é”®åˆ—CUST_IDåQŒè¯¥åˆ—和主表的主键列id除了列名不同åQŒå…¶ä»–定义一栗÷€?<br />           @Entity<br /> @Table(name="CUSTOMER")<br /> @SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"åQŒreferencedColumnName="id"))<br /> public class Customer {<br /> @Id(generate = GeneratorType.AUTO)<br /> public Integer getId() {<br /> return id;<br /> }<br /> }</p> <p>下面的代码说明Employeeå’ŒEmployeeInfo是一对一关系åQŒEmployee的主键列idä½œäØ“å¤–é”®æŒ‡å‘EmployeeInfo的主键列INFO_IDã€?<br />         <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 /> · value: 一个PrimaryKeyJoinColumn数组åQŒåŒ…含所有PrimaryKeyJoinColumnã€?<br /> 下面的代码说明了Employeeå’ŒEmployeeInfo是一对一关系。他们都使用复合主键åQŒå¾è¡¨æ—¶éœ€è¦åœ¨Employee表徏立一个外键,从Employee的主键列id,name指向EmployeeInfo的主键列INFO_IDå’ŒINFO_NAME. <br />         <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çš„å±žæ€§ï¼ŒæŒ‡å®šçš„è¿™äº›å±žæ€§ä¸ä¼šè¢«æŒä¹…åŒ–ï¼Œä¹Ÿä¸ä¼šäØ“˜q™äº›å±žæ€§å¾è¡¨ã€?<br />         <br /> @Transient<br /> private String name;</p> <p><strong>Version </strong><br /> Version指定实体¾cÕdœ¨ä¹è§‚事务中的version属性。在实体¾c»é‡æ–°ç”±EntityManager½Ž¡ç†òq¶ä¸”加入åˆîC¹è§‚事务中æ—Óž¼Œä¿è¯å®Œæ•´æ€§ã€‚每一个类只能有一个属性被指定为versionåQŒversion属性应该映ž®„到实体¾cȝš„主表上ã€?<br /> 下面的代码说明versionNumå±žæ€§ä½œä¸ø™¿™ä¸ªç±»çš„versionåQŒæ˜ ž®„到数据库中主表的列名是OPTLOCKã€?<br />         <br /> @Version<br /> @Column("OPTLOCK")<br /> protected int getVersionNum() { return versionNum; }</p> <p><strong>Lob</strong> <br /> Lob指定一个属性作为数据库支持的大对象¾cÕdž‹åœ¨æ•°æ®åº“中存储。ä‹É用LobType˜q™ä¸ªæžšä‹D来定义Lob是二˜q›åˆ¶¾cÕdž‹˜q˜æ˜¯å­—符¾cÕdž‹ã€?<br /> LobTypeæžšä‹D¾cÕdž‹è¯´æ˜ŽåQ?<br /> · BLOB 二进制大对象åQŒByte[]或者Serializableçš„ç±»åž‹å¯ä»¥æŒ‡å®šäØ“BLOBã€?<br /> · CLOB 字符型大对象åQŒchar[]、Character[]或String¾cÕdž‹å¯ä»¥æŒ‡å®šä¸ºCLOBã€?<br /> 元数据属性说明: <br /> · fetchåQ?定义˜q™ä¸ªå­—段是lazy loaded˜q˜æ˜¯eagerly fetched。数据类型是FetchTypeæžšä‹DåQŒé»˜è®¤äØ“LAZY,即lazy loaded. <br /> · typeåQ?定义˜q™ä¸ªå­—段在数据库中的JDBC数据¾cÕdž‹ã€‚数据类型是LobTypeæžšä‹DåQŒé»˜è®¤äØ“BLOBã€?<br /> 下面的代码定义了一个BLOB¾cÕdž‹çš„属性和一个CLOB¾cÕdž‹çš„属性ã€?<br />         <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åQŒä‹É用JoinTable的默认倹{€?<br /> 元数据属性说明: <br /> · table:˜q™ä¸ªjoin tableçš„Table定义ã€?<br /> · joinColumns:定义指向所有者主表的外键列,数据¾cÕdž‹æ˜¯JoinColumn数组ã€?<br /> · inverseJoinColumns:定义指向非所有者主表的外键列,数据¾cÕdž‹æ˜¯JoinColumn数组ã€?<br /> 下面的代码定义了一个连接表CUSTå’ŒPHONEçš„join table。join table的表名是CUST_PHONEåQŒåŒ…含两个外键,一个外键是CUST_IDåQŒæŒ‡å‘表CUST的主键IDåQŒå¦ä¸€ä¸ªå¤–键是PHONE_IDåQŒæŒ‡å‘表PHONE的主键IDã€?<br />         <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定义一个主键值生成器åQŒåœ¨Id˜q™ä¸ªå…ƒæ•°æ®çš„generateåQTABLEæ—Óž¼Œgenerator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义ã€?<br /> 生成器是为多个实体类提供˜qžç®‹çš„IDå€¼çš„è¡¨ï¼Œæ¯ä¸€è¡ŒäØ“ä¸€ä¸ªç±»æä¾›IDå€û|¼ŒID值通常是整数ã€?<br /> 元数据属性说明: <br /> · name:生成器的唯一名字åQŒå¯ä»¥è¢«Id元数据ä‹É用ã€?<br /> · table:生成器用来存储id值的Table定义ã€?<br /> · pkColumnName:生成器表的主键名¿U°ã€?<br /> · valueColumnName:生成器表的ID值的列名¿U°ã€?<br /> · pkColumnValue:生成器表中的一行数据的主键倹{€?<br /> · initialValue:id值的初始倹{€?<br /> · allocationSize:id值的增量ã€?<br /> 下面的代码定义了两个生成器empGenå’ŒaddressGenåQŒç”Ÿæˆå™¨çš„表是ID_GENã€?<br />         <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定义一个主键值生成器åQŒåœ¨Id˜q™ä¸ªå…ƒæ•°æ®çš„generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。生成器是数据库支持的sequence对象ã€?<br /> 元数据属性说明: <br /> · name:生成器的唯一名字åQŒå¯ä»¥è¢«Id元数据ä‹É用ã€?<br /> · sequenceName:数据库中åQŒsequence对象的名¿U°ã€‚如果不指定åQŒä¼šä½¿ç”¨æä¾›å•†æŒ‡å®šçš„默认名称ã€?<br /> · initialValue:id值的初始倹{€?<br /> · allocationSize:id值的增量ã€?<br /> 下面的代码定义了一个ä‹É用提供商默认名称的sequence生成器ã€?<br />         <br /> @SequenceGenerator(name="EMP_SEQ", allocationSize=25)</p> <p><strong>DiscriminatorColumn </strong><br /> DiscriminatorColumn定义在ä‹É用SINGLE_TABLE或JOINED¾l§æ‰¿½{–略的表中区别不¾l§æ‰¿å±‚次的列ã€?<br /> 元数据属性说明: <br /> · name:column的名字。默认å€égØ“TYPEã€?<br /> · columnDefinition:生成DDLçš„sql片断ã€?<br /> · length:String¾cÕdž‹çš„column的长度,其他¾cÕdž‹ä½¿ç”¨é»˜è®¤å€?0ã€?<br /> ä¸‹é¢çš„ä»£ç å®šä¹‰äº†ä¸€ä¸ªåˆ—åäØ“DISCåQŒé•¿åº¦äØ“20çš„String¾cÕdž‹çš„区别列ã€?<br />         <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> </p><img src ="http://www.aygfsteel.com/rain1102/aggbug/253913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/rain1102/" target="_blank">Eric.Zhou</a> 2009-02-09 15:38 <a href="http://www.aygfsteel.com/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å’ŒFalsehttp://www.aygfsteel.com/rain1102/archive/2008/08/29/225667.htmlEric.ZhouEric.ZhouFri, 29 Aug 2008 15:38:00 GMThttp://www.aygfsteel.com/rain1102/archive/2008/08/29/225667.htmlhttp://www.aygfsteel.com/rain1102/comments/225667.htmlhttp://www.aygfsteel.com/rain1102/archive/2008/08/29/225667.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/225667.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/225667.html     List<Meeting> meetings = new ArrayList<Meeting>();
    meetings = mgr.createQuery("select new com.integral7.ejb3.investigations.Meeting(m.id, m.scheduledDate, m.type.name, m.description, " +
        "case when exists(select id from MeetingAudit ma where ma.meeting = m and ma.audit.id = ?0) then True else False end) " +
        " from Meeting m " +
        " where m.owner.id = ?1 and m.scheduledDate >= ?2 order by m.scheduledDate asc")
        .setParameter(0, candidateId)
        .setParameter(1, ownerId)
        .setParameter(2, DateUtils.convertToBeginningOfDay(new Date())).getResultList();
    return meetings;
 }

˜q™é‡Œä¸»è¦æ³¨æ„True å’?span style="color: #008000">False 首字母必™åÕd¤§å†™å…¶ä½™å°å†?

Eric.Zhou 2008-08-29 23:38 发表评论
]]>
HQL语句中的数据¾cÕdž‹è½¬æ¢http://www.aygfsteel.com/rain1102/archive/2008/07/22/216579.htmlEric.ZhouEric.ZhouTue, 22 Jul 2008 05:26:00 GMThttp://www.aygfsteel.com/rain1102/archive/2008/07/22/216579.htmlhttp://www.aygfsteel.com/rain1102/comments/216579.htmlhttp://www.aygfsteel.com/rain1102/archive/2008/07/22/216579.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/216579.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/216579.html比如我数据库里面使用varchar和对象是使用字符串类åž? 而实际里面的值都是整æ•? ˜q™æ ·éœ€è¦æŒ‰ç…§æ•°å€¼æ¥æŽ’序, å› äØ“å¦‚æžœæŒ‰ç…§å­—ç¬¦ä¸²æŽ’åº?04会在 1020后面.
使用cast(ce.caseID as long) 或者cast(ce.caseID as integer) ˜q™è¦çœ‹ä½ çš„需要了.
注意:longå’Œinteger的首字母要小å†? 不然会报½IºæŒ‡é’ˆå¼‚å¸?



Eric.Zhou 2008-07-22 13:26 发表评论
]]>
关于hibernate3中enum¾cÕdž‹çš„æ•°æ®æŒä¹…化问题http://www.aygfsteel.com/rain1102/archive/2008/07/01/211915.htmlEric.ZhouEric.ZhouTue, 01 Jul 2008 07:26:00 GMThttp://www.aygfsteel.com/rain1102/archive/2008/07/01/211915.htmlhttp://www.aygfsteel.com/rain1102/comments/211915.htmlhttp://www.aygfsteel.com/rain1102/archive/2008/07/01/211915.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/211915.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/211915.html
寚wœ€è¦è§£å†³çš„问题的描˜qŽÍ¼š
把一ä¸?span class="hilite2">enum¾cÕdž‹çš„å­—ŒD‰|Œä¹…化到数据库中,写入到数据库中的å€égØ“Integer¾cÕdž‹åQŒä¸”有特定的含义åQ?br />
我们知道åQŒå¦‚果我们某一个pojoå¯¹è±¡çš„æŸä¸ªå±žæ€§äØ“enum¾cÕdž‹çš„话åQŒåœ¨æŒä¹…化的时候可能会出现如下两种情况:
1、数据库中enum_colçš„ç±»åž‹äØ“(oracle:number或者sql server:numeric)
   @Column(name="enum_col")
   public MyEnum getCol(){
      return this.col;
   }
此种情况下,存到数据库中的数据时col.ordinal()所˜q”回的intæ•°å€?br /> 2、数据库中enum_colçš„ç±»åž‹äØ“(oracle:varchar2,或者sql serveråQšvarchar)
   @Column(name="enum_col")
   public MyEnum getCol(){
      return this.col;
   }
此种情况下,存储到数据库中的å€égؓ定义此enum是所使用的名字如åQ?br />    public enum MyEnum{
       DATA1,
       DATA2;
   }
则,如果this.col代表DATA1则写DATA1到数据库中去�/pre>
那么我们通过什么样的手ŒD‰|¥æ”¹å˜˜q™äº›å‘¢ï¼Ÿå¦‚果使用的是hibernate的话可以借助于UserType来实玎ͼš
首先、定义一个enum MyEnumDataåQ?在持久化的时候把其code写到数据库中åŽ?
package ec.snow.hib.pojos;
public enum MyEnumData{
   DATA1("data1",100),
   DATA2("data2",200),
   DATA3("data3",300);
   private String name;
   private int code;
  
   public int getCode(){
      return this.code;
   }
   public String getName(){
      return this.name;
   }
   MyEnumData(String name,int code){
      this.name = name;
      this.code = code;
   }
//辅助æ–ÒŽ(gu¨©)³•åQŒä¸»è¦åœ¨UserType的实çŽîC¸­é€šè¿‡ç›¸åº”çš„code得到MyEnumData

public static MyEnumData formCode(int code){

       for(MyEnumData u:MyEnumData.values()){
          if(u.getCode()==code)return u;
       }
       return null;
   }
}
//*******************************
接下来、定义相应的UserType的实玎ͼš
package com.snow.hib.pojos;
import Java.io.Serializable;
import Java.sql.PreparedStatement;
import Java.sql.ResultSet;
import Java.sql.SQLException;
import Java.sql.Types;
import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
/**
 *@author anwxAn Weixiao
 *@version $Id$
 */
public class MyEnumDataType implements UserType {
  
    public int[] sqlTypes() {  
        int[] types = {Types.INTEGER};        
        return types;  
    }  
 
    public Class returnedClass(){
        return UserTitle.class;  
    }  
 
    public boolean equals(Object x, Object y) throws HibernateException {  
        return x == y;  
    }  
 
    public int hashCode(Object x) throws HibernateException {  
        return x.hashCode();  
    }  
 
    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException {  
        int code = rs.getInt(names[0]);  
        return rs.wasNull() ? null : MyEnumData.formCode(code);//notice code to use   
    }  
 
    public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException {  
        if (value == null) {  
            st.setNull(index, Types.INTEGER);  
        } else {  
            st.setInt(index, ((MyEnumData) value).getCode());  
        }  
    }  
 
    public Object deepCopy(Object value) throws HibernateException {  
        return value;  
    }  
 
    public boolean isMutable() {  
        return false;  
    }  
 
    public Serializable disassemble(Object value) throws HibernateException {  
        return (Serializable) deepCopy(value);  
    }  
 
    public Object assemble(Serializable cached, Object owner) throws HibernateException {  
        return deepCopy(cached);  
    }  
 
    public Object replace(Object original, Object target, Object owner)
throws HibernateException {  
        return deepCopy(original);  
    }    
}
//**********************************
最后、通过自定义的UserType来实现对enum的有效持久化
package com.snow.hib.pojos;
import Java.io.Serializable;
import Javax.persistence.Column;
import Javax.persistence.Entity;
import Javax.persistence.Id;
import Javax.persistence.Table;
import org.hibernate.annotations.Type;
/**
 *@author anwxAn Weixiao
 *@version
 */
@Entity
@Table(name="my_def_type")
public class UseMyEnumData implements Serializable{  
  
    private static final long serialVersionUID = 6905822670746966787L;
    private String id;
    private String username;    
    private MyEnumData enumData;  
   
    @Column(updatable = true,nullable = true,name="MY_TITLE")
    @Type(type="com.snow.hib.pojos.MyEnumDataType")
    public MyEnumData getEnumData() {  
        return enumData;  
    }  
 
    public void setEnumData(MyEnumData data) {  
        this.enumData = data;  
    }
   
    @Column(updatable=true,nullable = true,name="USER_NAME")
    public String getUsername() {  
        return username;  
    } 
    public void setUsername(String username) {  
        this.username = username;  
    }
 /**
  * @return Returns the id.
  */
    @Id
 public String getId() {
  return id;
 }
 /**
  * @param id The id to set.
  */
 public void setId(String id) {
  this.id = id;
 }   
}
下面是测试结果:
//***************************Test result
       UseMyEnumData data = new UseMyEnumData();
          data.setId("123456");
          data.setTitle(MyEnumData.DATA1);
          data.setUsername("chsi:manager");
          manager.saveUseMyEnumData(title);
则数据库中写入的数据为: [123456 100 chsi:manager]


˜q˜æœ‰ä¸€ç‚šwœ€è¦æ³¨æ„çš„æ˜¯ï¼Œå¦‚æžœ¾pȝ»Ÿä¸­ç”¨æ¥åª„ž®?span class="hilite2">enum¾cÕdž‹çš„æ•°æ®å¯èƒ½æœ‰å‡ºçް½Iºå€¼çš„æ—¶å€™hibernate在处理媄ž®„的时候会
æŠ?span class="hilite2">Enum¾cÕdž‹å½±å°„为null,也就是没有对应的数据åQŒè¿™åœ¨å¤„理旧有系¾lŸæ•°æ®çš„æ—¶å€™ä¼šæœ‰ç”¨å¤„哦…………


]]>配置Entity beans为缓å­?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/rain1102/archive/2008/06/13/207622.html</guid><wfw:comment>http://www.aygfsteel.com/rain1102/comments/207622.html</wfw:comment><comments>http://www.aygfsteel.com/rain1102/archive/2008/06/13/207622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/rain1102/comments/commentRss/207622.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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 ¾c…R€‚JBoss EJB 3.0 ž®†æ¥çš„版本将支持 annotating entities 和所¾~“存的它们的关系的集合,但是现在你不得不直接配置底层çš?hibernate 引擎。让我们看看通过可选的property元素配置 hibernate ¾~“存选项的persistence.xmlæ–‡äšg。下面persistence.xml 里的定义¾~“存的元素应该被启用åQ?/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="#008000"> Clustered cache with TreeCache </font>--> <br /> <font color="#0000ff"><</font><font color="#800000">property</font> <font color="#ff0000">name</font><font color="#0000ff">="cache.provider_class"</font><font color="#0000ff">></font> <br /> org.jboss.ejb3.entity.TreeCacheProviderHook <br /> <font color="#0000ff"></</font><font color="#800000">property</font><font color="#0000ff">></font></div> </div> <div> </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"><</font><font color="#800000">property</font> <font color="#ff0000">name</font><font color="#0000ff">="treecache.mbean.object_name"</font><font color="#0000ff">></font> <br /> jboss.cache:service=EJB3EntityTreeCache <br /> <font color="#0000ff"></</font><font color="#800000">property</font><font color="#0000ff">></font></div> </div> <div> </div> <div><span style="font-size: 10.5pt; font-family: 宋体" AR-SA New Times .5pt;>下一步我们需要配¾|?entities 被缓存的内容。就像上面所展示的样åQŒç¼ºçœæ˜¯ä»€ä¹ˆéƒ½ä¸ç¼“存。我们ä‹É用@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> </div> <div><span style="font-size: 10.5pt; font-family: 宋体" AR-SA New Times .5pt;>    一个简单的原则ž®±æ˜¯åQŒä½ åº”该对很ž®‘变动和频繁使用的对象进行缓å­?你可以在ejb3-entity-cache-service.xml配置文äšgé‡ŒäØ“æ¯ä¸ª entity bean 微调¾~“存讄¡½®ã€‚例如,你可以指定缓存的大小。如果缓存里的对象太多,¾~“存有可能挤掉最老的对象åQˆæˆ–者最ž®‘用的对象,依你的配¾|®è€Œå®šåQ‰æ¥¾l™æ–°å¯¹è±¡ç•™å‡º½Iºé—´ã€‚mycompany.Customer entity bean 的缓存区åQˆcache regionåQ‰æ˜¯/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"><</font><font color="#800000">server</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</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">></font> <br /> <font color="#0000ff"><</font><font color="#800000">depends</font><font color="#0000ff">></font>jboss:service=Naming <br /> <font color="#0000ff"><</font><font color="#800000">depends</font><font color="#0000ff">></font>jboss:service=TransactionManager <br /> ... ... <br /> <font color="#0000ff"><</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="EvictionPolicyConfig"</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">config</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="wakeUpIntervalSeconds"</font><font color="#0000ff">></font>5<font color="#0000ff"></</font><font color="#800000">attribute</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">region</font> <font color="#ff0000">name</font><font color="#0000ff">="/_default_"</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="maxNodes"</font><font color="#0000ff">></font>5000<font color="#0000ff"></</font><font color="#800000">attribute</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="timeToLiveSeconds"</font><font color="#0000ff">></font>1000<font color="#0000ff"></</font><font color="#800000">attribute</font><font color="#0000ff">></font> <br /> <font color="#0000ff"></</font><font color="#800000">region</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">region</font> <font color="#ff0000">name</font><font color="#0000ff">="/mycompany/Customer"</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="maxNodes"</font><font color="#0000ff">></font>10<font color="#0000ff"></</font><font color="#800000">attribute</font><font color="#0000ff">></font> <br /> <font color="#0000ff"><</font><font color="#800000">attribute</font> <font color="#ff0000">name</font><font color="#0000ff">="timeToLiveSeconds"</font><font color="#0000ff">></font>5000<font color="#0000ff"></</font><font color="#800000">attribute</font><font color="#0000ff">></font> <br /> <font color="#0000ff"></</font><font color="#800000">region</font><font color="#0000ff">></font> <br /> ... ... <br /> <font color="#0000ff"></</font><font color="#800000">config</font><font color="#0000ff">></font> <br /> <font color="#0000ff"></</font><font color="#800000">attribute</font><font color="#0000ff">></font> <br /> <font color="#0000ff"></</font><font color="#800000">mbean</font><font color="#0000ff">></font> <br /> <font color="#0000ff"></</font><font color="#800000">server</font><font color="#0000ff">></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 ¾cÀLŒ‡å®šç¼“存区åQˆcache regionåQ‰ï¼Œ˜q™ä¸ª¾cÈš„æ‰€æœ‰å®žä¾‹å°†è±¡ä¸Šé¢å®šä¹‰çš„一æ ïL(f¨¥ng)¼“存在/_default区里。EJB3 Query API 提供了让你在指定的缓存区里保存或载入查询¾l“æžœåQˆå°±æ˜?entity beans 的集合)的方法ã€?/font></span></span></div> </div><img src ="http://www.aygfsteel.com/rain1102/aggbug/207622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/rain1102/" target="_blank">Eric.Zhou</a> 2008-06-13 11:55 <a href="http://www.aygfsteel.com/rain1102/archive/2008/06/13/207622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3执行SQL语句http://www.aygfsteel.com/rain1102/archive/2008/03/28/189371.htmlEric.ZhouEric.ZhouFri, 28 Mar 2008 15:13:00 GMThttp://www.aygfsteel.com/rain1102/archive/2008/03/28/189371.htmlhttp://www.aygfsteel.com/rain1102/comments/189371.htmlhttp://www.aygfsteel.com/rain1102/archive/2008/03/28/189371.html#Feedback1http://www.aygfsteel.com/rain1102/comments/commentRss/189371.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/189371.html public Integer batchSave(final String sql){
  Session session = this.getSession();
  Transaction tx = session.beginTransaction();
  Integer result = -1;
  try {
   tx.begin();
   result = session.createSQLQuery(sql).executeUpdate();
   session.flush();
   tx.commit();
  } catch (DataAccessException e) {
   e.printStackTrace();
   if (tx != null) {
    tx.rollback();
   }
  } finally {
   session.close();
  }
  return result;
 }

]]>
Hibernate3 错误åQ?could not initialize proxy - no Session http://www.aygfsteel.com/rain1102/archive/2008/02/28/182707.htmlEric.ZhouEric.ZhouThu, 28 Feb 2008 08:04:00 GMThttp://www.aygfsteel.com/rain1102/archive/2008/02/28/182707.htmlhttp://www.aygfsteel.com/rain1102/comments/182707.htmlhttp://www.aygfsteel.com/rain1102/archive/2008/02/28/182707.html#Feedback10http://www.aygfsteel.com/rain1102/comments/commentRss/182707.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/182707.html异常åQ?br /> org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111
)

原因åQ?/font>hibernate3 many-to-one的默认选项æ˜?lazy = "proxy"
解决æ–ÒŽ(gu¨©)³•åQ?/strong><many-to-one>  & <set> 中设¾|?lazy="false"


]]>
利用Hibernate Search全文‹‚€ç´¢ä½ çš„领域模åž?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/rain1102/archive/2008/02/18/180470.html</guid><wfw:comment>http://www.aygfsteel.com/rain1102/comments/180470.html</wfw:comment><comments>http://www.aygfsteel.com/rain1102/archive/2008/02/18/180470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/rain1102/comments/commentRss/180470.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/rain1102/services/trackbacks/180470.html</trackback:ping><description><![CDATA[<p>Hibernate Search™å¹ç›®çš„Beta½W¬äºŒç‰ˆåˆšåˆšå‘布。InfoQ为此采访了Hibernate Search™å¹ç›®çš„发起ähEmmanuel Bernard以了解更多细节,Emmanuel同时也是相关™å¹ç›®Hibernate Annotationså’ŒHibernate EntityManager的发起äh。根据Emmanuel所­a€åQŒHibernate Search目的是帮助Hibernateçš„ä‹É用者或是Java Persistence APIåQˆJPAåQ‰çš„使用者可以通过全文搜烦索引来访问Hibernate或JPA½Ž¡ç†çš„对象。Hibernate Search™å¹ç›®çš„主要特性包含以下几个方面:</p> <p>Lucene集成——作为强大高效的‹‚€ç´¢å¼•擎,Lucene的美名早已久¾lè€ƒéªŒäº†ï¼› <br /> 数据的自动插入和更新——当一个对象通过Hibernateæ·ÕdŠ æˆ–æ›´æ–°æ—¶åQŒçƒ¦å¼•也会相应进行透明的更斎ͼ› <br /> 支持众多复杂的搜索方式——可快速的使用通配½W¦è¿›è¡Œæœç´¢ï¼Œä»¥åŠå¤šå…³é”®è¯å…¨æ–‡‹‚€ç´¢ï¼ˆmulti-word text searchesåQ‰å’Œ˜q‘似或同义词搜烦åQˆapproximation/synonym searchesåQ‰ï¼Œæˆ–根据相å…Ïx€§æŽ’列搜索结果; <br /> 搜烦集群åQˆSearch ClusteringåQ‰â€”—Hibernate Search提供了内建搜索集¾Ÿ¤è§£å†Ïx–¹æ¡ˆï¼Œå…¶ä¸­åŒ…括一个基于JMS的异步查询和索引¾pȝ»ŸåQ?<br /> 对Lucene API接口的直接调用——如果用æˆäh‰“½Ž—处理某些特别复杂的问题åQŒå¯ä»¥åœ¨æŸ¥è¯¢ä¸­ç›´æŽ¥ä‹É用Lucene提供的API接口åQ?<br /> 对Lucene的自动管理——Hibernate Search可以½Ž¡ç†òq¶ä¼˜åŒ–Lucene的烦引,òq¶ä¸”非常高效åœîC‹É用Luceneçš„API接口ã€?<br /> ™å¹ç›®çš„主要目标包含以下几个方面:</p> <p>易用性——和Hibernateçš„ORMæ˜ å°„ä¸€æ øP¼ŒHibernate Search帮助用户实现了业åŠ?0%的工作,òq¶ä¸”ä½¿ç”¨æˆ·ä¸“æ³¨äºŽä½™ä¸‹æ›´äØ“å›°éš¾çš„ä¸šåŠ¡å®žçŽ°éƒ¨åˆ†ï¼› <br /> 和已有的Hibernate/JPA¾~–程模型保持一致性——更è½ÀL¾åœ°é›†æˆHibernate/JPA¾~–程模型æ˜?#8220;一开始就致力要实现的目标”ã€?/p><img src ="http://www.aygfsteel.com/rain1102/aggbug/180470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/rain1102/" target="_blank">Eric.Zhou</a> 2008-02-18 15:16 <a href="http://www.aygfsteel.com/rain1102/archive/2008/02/18/180470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetåQŒListå’ŒHibernate里面的PersistentSethttp://www.aygfsteel.com/rain1102/archive/2008/01/16/175733.htmlEric.ZhouEric.ZhouWed, 16 Jan 2008 09:39:00 GMThttp://www.aygfsteel.com/rain1102/archive/2008/01/16/175733.htmlhttp://www.aygfsteel.com/rain1102/comments/175733.htmlhttp://www.aygfsteel.com/rain1102/archive/2008/01/16/175733.html#Feedback3http://www.aygfsteel.com/rain1102/comments/commentRss/175733.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/175733.html 然后看到Hibernate里面用到一对多åQŒæˆ–者多对多时候会用到SetåQŒç„¶åŽæˆ‘看自å·Þqš„modelåQŒé‡Œé¢æ˜Žæ˜Žç”¨çš„æ˜¯HashSetåQŒäؓ什么他ž®±å¯ä»¥æŒ‰ç…§é›†åˆé‡Œå¯¹è±¡çš„å­—ŒD‰|Ž’åºå‘¢åQŸé—®äº†æ¨å¤§å“¥¾lˆäºŽçŸ¥é“了,原来在返回的时候返回给用户的是Hibernate的自å·Þqš„¾c»ï¼šorg.hibernate.collection.PersistentSet。Oh my god!


]]>
MySQL下ä‹É用Hibernateçš„Query中setMaxResultsæ–ÒŽ(gu¨©)³•出现错误http://www.aygfsteel.com/rain1102/archive/2007/12/27/170767.htmlEric.ZhouEric.ZhouWed, 26 Dec 2007 16:47:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/12/27/170767.htmlhttp://www.aygfsteel.com/rain1102/comments/170767.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/12/27/170767.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/170767.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/170767.html System Runtime Error: JDBC exception on Hibernate data access; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
˜q™æ˜¯å› äØ“MySQL不支持topåQŒè€Œæ˜¯ä½¿ç”¨äº†limitåQ?br /> 目前˜q˜æ²¡æ‰‘Öˆ°è§£å†³åŠžæ³•åQŒä¸çŸ¥é“ä¸ÞZ»€ä¹ˆHibernate搞出˜q™çŽ©æ„ï¼Œòq²å—不è{换一下,˜q˜æ˜¯bug呢!晕!

¾lˆäºŽè§£å†³äº†ï¼Œä¸æ˜¯äººå®¶çš„错误,而是我自己弄错了。方­a€òq²é”™äº†ï¼å¤ÞpÓ|åQ?img src ="http://www.aygfsteel.com/rain1102/aggbug/170767.html" width = "1" height = "1" />

]]>
query.scroll()å’Œquery.setMaxResults();query.setFirstResult() http://www.aygfsteel.com/rain1102/archive/2007/12/26/170754.htmlEric.ZhouEric.ZhouWed, 26 Dec 2007 15:13:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/12/26/170754.htmlhttp://www.aygfsteel.com/rain1102/comments/170754.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/12/26/170754.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/170754.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/170754.htmlquery.scroll()å’Œquery.setMaxResults();query.setFirstResult()
˜q™è¿™ä¸¤ç§æ–ÒŽ(gu¨©)³•都可以取åˆîC¸€å®šèŒƒå›´å†…的数据,用来数据分页昄¡¤ºã€‚那么那¿Uæ–¹æ³•更好呢åQ?/p>

scroll是用JDBC2.0的可滚动¾l“果集实玎ͼ›query.setMaxResults();query.setFirstResult()是数据库SQL语句实现ã€?/p>

在数据库˜q›è¡Œåˆ†é¡µæ˜¯é¦–选的方式。数据库分页实际上是利用数据库本íw«SQL扩展的功能进行分™åµï¼Œä¾‹å¦‚MySQLçš?limit 0,50˜q™æ ·çš„SQL语句。不但速度快,而且非常节省内存。不˜q‡ä¸æ˜¯æ¯¿Uæ•°æ®åº“的都有这¿Uåˆ†™å‰|”¯æŒçš„SQLåQŒä¾‹å¦‚SQL Serverž®×ƒ¸æ”¯æŒã€?/p>

scroll是利用JDBC2.0的功能做分页的,那么ž®±å®Œå…¨å–决于特定数据库的JDBC Driver的实çŽîCº†ã€‚事实上大部分JDBC Driver都是把所有的¾l“果集都一‹Æ¡å–到内存,然后再分™å늚„。如果这个结果集非常大,例如几万条,不但½E‹åºæ‰§è¡Œé€Ÿåº¦ä¼šå¾ˆæ…¢ï¼Œè€Œä¸”很容易导致out of memory。当然个别JDBC Driver使用了服务器端游标来实现åQŒé‚£ä¹ˆå°±ä¸ä¼šå¯ÆD‡´˜q™ç§é—®é¢˜åQŒä¾‹å¦‚jTDSã€?/p>

]]>
Hibernate的复杂用法HibernateCallbackhttp://www.aygfsteel.com/rain1102/archive/2007/12/26/170638.htmlEric.ZhouEric.ZhouWed, 26 Dec 2007 09:09:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/12/26/170638.htmlhttp://www.aygfsteel.com/rain1102/comments/170638.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/12/26/170638.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/170638.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/170638.htmlHibernateTemplate˜q˜æä¾›ä¸€¿Uæ›´åŠ çµ‹zÈš„æ–¹å¼æ¥æ“ä½œæ•°æ®åº“åQŒé€šè¿‡˜q™ç§æ–¹å¼å¯ä»¥å®Œå…¨ä½¿ç”¨Hibernate的操作方式ã€?/span>HibernateTemplate的灵‹z»è®¿é—®æ–¹å¼æ˜¯é€šè¿‡å¦‚下两个æ–ÒŽ(gu¨©)³•完成åQ?/span>

q      Object execute(HibernateCallback action)

q      List execute(HibernateCallback action)

˜q™ä¸¤ä¸ªæ–¹æ³•都需要一ä¸?/span>HibernateCallback的实例,HibernateCallback实例可在ä»ÖM½•有效çš?/span>Hibernate数据讉K—®ä¸­ä‹É用。程序开发者通过HibernateCallbackåQŒå¯ä»¥å®Œå…¨ä‹Éç”?/span>Hibernate灉|´»çš„æ–¹å¼æ¥è®‰K—®æ•°æ®åº“,解决Springž®è£…Hibernate后灵‹zÀL€§ä¸­‘³çš„¾~ºé™·ã€?/span>HibernateCallback是一个接口,该接口只有一个方æ³?/span>doInHibernate(org.hibernate.Session session)åQŒè¯¥æ–ÒŽ(gu¨©)³•只有一个参æ•?/span>Sessionã€?/span>

通常åQŒç¨‹åºä¸­é‡‡ç”¨å®žçްHibernateCallback的匿名内部类来获å?/span>HibernateCallback的实例,æ–ÒŽ(gu¨©)³•doInHibernate的方法体ž®±æ˜¯Spring执行的持久化操作。具体代码如下:

public class PersonDaoImpl implements PersonDao

{
 // ¿Uæœ‰å®žä¾‹å˜é‡ä¿å­˜SessionFactory
 private SessionFactory sessionFactory;
 // 依赖注入必须的setteræ–ÒŽ(gu¨©)³•
 public void setSessionFactory(SessionFactory sessionFactory){
  this.sessionFactory = sessionFactory;
 }
 /**
  *
  * 通过人名查找所有匹配该名的Person实例
  *
  * @param name
  *            匚w…çš„ähå?br />   *
  * @return 匚w…è¯¥ä“Q命的全部Person集合
  *
  */
 public List findPersonsByName(final String name){
  // 创徏HibernateTemplate实例
  HibernateTemplate hibernateTemplate =new HibernateTemplate(this.sessionFactory);
        // ˜q”回HibernateTemplateçš„execute的结æž?br />   return (List) hibernateTemplate.execute(
    // 创徏匿名内部¾c?br />     new HibernateCallback(){
     public Object doInHibernate(Session session) throws HibernateException{
      // 使用条äšg查询的方法返å›?br />       List result = session.createCriteria(Person.class)
       .add(Restrictions.like("name", name+"%").list();
      return result;
                     }
    });
    }
}

注意åQšæ–¹æ³?/span>doInHibernateæ–ÒŽ(gu¨©)³•内可以访é—?/span>SessionåQŒè¯¥Session对象是绑定到该线½E‹çš„Session实例。该æ–ÒŽ(gu¨©)³•内的持久层操作,与不使用Spring时的持久层操作完全相同。这保证对于复杂的持久层讉K—®åQŒä¾ç„¶å¯ä»¥ä‹Éç”?/span>Hibernate的访问方式ã€?/span>

]]>
HibernateTemplate的常规用æ³?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/rain1102/archive/2007/12/26/170633.html</guid><wfw:comment>http://www.aygfsteel.com/rain1102/comments/170633.html</wfw:comment><comments>http://www.aygfsteel.com/rain1102/archive/2007/12/26/170633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/rain1102/comments/commentRss/170633.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/rain1102/services/trackbacks/170633.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; line-height: 15.7pt">HibernateTemplate<span style="font-family: 宋体">提供非常多的常用æ–ÒŽ(gu¨©)³•来完成基本的操作åQŒæ¯”如通常的增加、删除、修攏V€æŸ¥è¯¢ç­‰æ“ä½œåQ?/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'">      </span></span>void delete(Object entity)<span style="font-family: 宋体">åQšåˆ é™¤æŒ‡å®šæŒä¹…化实例</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>deleteAll(Collection entities)<span style="font-family: 宋体">åQšåˆ é™¤é›†åˆå†…全部持久化类实例</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>find(String queryString)<span style="font-family: 宋体">åQšæ ¹æ?/span>HQL<span style="font-family: 宋体">查询字符串来˜q”回实例集合</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>findByNamedQuery(String queryName)<span style="font-family: 宋体">åQšæ ¹æ®å‘½åæŸ¥è¯¢è¿”å›žå®žä¾‹é›†å?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>get(Class entityClass, Serializable id)<span style="font-family: 宋体">åQšæ ¹æ®ä¸»é”®åŠ è½½ç‰¹å®šæŒä¹…åŒ–¾cȝš„实例</span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>save(Object entity)<span style="font-family: 宋体">åQšä¿å­˜æ–°çš„实ä¾?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>saveOrUpdate(Object entity)<span style="font-family: 宋体">åQšæ ¹æ®å®žä¾‹çŠ¶æ€ï¼Œé€‰æ‹©ä¿å­˜æˆ–è€…æ›´æ–?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>update(Object entity)<span style="font-family: 宋体">åQšæ›´æ–°å®žä¾‹çš„çŠ¶æ€ï¼Œè¦æ±‚</span>entity<span style="font-family: 宋体">是持久状æ€?/span></p> <p><span style="font-family: Wingdings">q<span style="font: 7pt 'Times New Roman'">      </span></span>setMaxResults(int maxResults)<span style="font-family: 宋体">åQšè®¾¾|®åˆ†™å늚„大小</span></p><img src ="http://www.aygfsteel.com/rain1102/aggbug/170633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-26 16:46 <a href="http://www.aygfsteel.com/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 解决æ–ÒŽ(gu¨©)¡ˆ http://www.aygfsteel.com/rain1102/archive/2007/12/23/169853.htmlEric.ZhouEric.ZhouSun, 23 Dec 2007 12:47:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/12/23/169853.htmlhttp://www.aygfsteel.com/rain1102/comments/169853.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/12/23/169853.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/169853.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/169853.html Java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
 at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)
Spring å’?/span> Hibernate å…Þq”¨çš„一äº?/span> jar æ–‡äšg发生了版本冲½H?/span>, 删除 WEB-INF/lib/asm-2.2.3.jar 然后重启 Tomcat.
asm-2.2.3.jar
       asm.jar
       asm-attrs.jar
      asm-commons-2.2.3.jar
      asm-util-2.2.3.jar


]]>
Hibernate 参数讄¡½®ä¸€è§ˆè¡¨(è½?http://www.aygfsteel.com/rain1102/archive/2007/07/16/130548.htmlEric.ZhouEric.ZhouMon, 16 Jul 2007 05:46:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/07/16/130548.htmlhttp://www.aygfsteel.com/rain1102/comments/130548.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/07/16/130548.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/130548.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/130548.htmlHibernate 参数讄¡½®ä¸€è§ˆè¡¨

 

属性名 用�
一个Hibernate ¾cÕdå…è®¸Hibernate针对特定的关¾pÀL•°æ®åº“生成优化的SQL. 取å€?/span>
输出所有SQL语句到控制台. 有一个另外的选择是把˜q™ä¸ªlog categoryè®¾äØ“ã€?eg. |
在log和console中打印出更漂亮的SQL�取�/span> |
在生成的SQLä¸? ž®†ç»™å®šçš„schema/tablespace附加于非全限定名的表名上. 取å€?/span>
在生成的SQLä¸? ž®†ç»™å®šçš„catalog附加于非全限定名的表名上. 取å€?/span>
创徏后,ž®†è‡ªåЍä‹É用这个名字绑定到JNDIä¸? 取å€?/span>
为单向关è?一对一, 多对一)的外˜qžæŽ¥æŠ“取åQˆouter join fetchåQ‰æ ‘(w¨¨i)讄¡½®æœ€å¤§æ·±åº? å€égؓ意味着ž®†å…³é—­é»˜è®¤çš„外连接抓å? 取å€?/span> 廸™®®åœ?tt class=literal>åˆ?tt class=literal>之间取å€?
为Hibernateå…Œ™”的批量抓取设¾|®é»˜è®¤æ•°é‡? 取å€?/span> 廸™®®çš„取å€égØ“, , å’?tt class=literal>
为由˜q™ä¸ªæ‰“开的所有Session指定默认的实体表现模å¼? 取å€?/span> , ,
强制Hibernate按照被更新数据的主键åQŒäØ“SQL更新排序。这么做ž®†å‡ž®‘åœ¨é«˜åÆˆå‘ç³»¾lŸä¸­äº‹åŠ¡çš„æ­»é”ã€?取å€?/span> |
如果开å? Hibernatež®†æ”¶é›†æœ‰åŠ©äºŽæ€§èƒ½è°ƒèŠ‚çš„ç»Ÿè®¡æ•°æ? 取å€?/span> |
如果开å? åœ¨å¯¹è±¡è¢«åˆ é™¤æ—¶ç”Ÿæˆçš„æ ‡è¯†å±žæ€§å°†è¢«é‡è®¾äØ“é»˜è®¤å€? 取å€?/span> |
如果开å? Hibernatež®†åœ¨SQL中生成有助于调试的注释信æ? 默认å€égØ“. 取å€?/span> |
Hibernate JDBC和连�connection)属�br>
属性名 用�
非零å€û|¼ŒæŒ‡å®šJDBC抓取数量的大ž®?(调用).
非零å€û|¼Œå…è®¸Hibernate使用JDBC2的批量更æ–? 取å€?/span> 廸™®®å?tt class=literal>åˆ?tt class=literal>之间的å€?
如果你想让你的JDBC驱动ä»?tt class=literal>˜q”回正确的行计数 , 那么ž®†æ­¤å±žæ€§è®¾ä¸?tt class=literal>(开启这个选项通常是安全的). 同时åQŒHibernatež®†äؓ自动版本化的数据使用扚w‡DML. 默认å€égØ“. eg. |
选择一个自定义çš?tt class=literal>. 多数应用½E‹åºä¸éœ€è¦è¿™ä¸ªé…¾|®å±žæ€? eg.
允许Hibernate使用JDBC2的可滚动¾l“æžœé›? 只有在ä‹É用用æˆähä¾›çš„JDBC˜qžæŽ¥æ—Óž¼Œ˜q™ä¸ªé€‰é¡¹æ‰æ˜¯å¿…要çš? 否则Hibernate会ä‹É用连接的元数æ? 取å€?/span> |
在JDBCè¯Õd†™æˆ?tt class=literal> 的类型时使用‹¹?stream)(¾pȝ»Ÿ¾U§å±žæ€?. 取å€?/span> |
在数据插入数据库之后åQŒå…è®æ€‹É用JDBC3 来获取数据库生成的key(é”?。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器旉™‡åˆ°é—®é¢˜ï¼Œè¯·å°†æ­¤å€ÆD®¾ä¸ºfalse. 默认情况下将使用˜qžæŽ¥çš„元数据来判定驱动的能力. 取å€?/span>
自定ä¹?tt class=literal>的类å? 此类用来向Hibernate提供JDBC˜qžæŽ¥. 取å€?/span>
讄¡½®JDBC事务隔离¾U§åˆ«. 查看Java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离¾U§åˆ«. 取å€?/span>
允许被缓存的JDBC˜qžæŽ¥å¼€å¯è‡ªåŠ¨æäº?autocommit) (不徏è®?. 取å€?/span> |
指定Hibernate在何旉™‡Šæ”¾JDBC˜qžæŽ¥. 默认情况ä¸?直到Session被显式关闭或被断开˜qžæŽ¥æ—?才会释放JDBC˜qžæŽ¥. 对于应用½E‹åºæœåŠ¡å™¨çš„JTA数据æº? 你应当ä‹Éç”?tt class=literal>, ˜q™æ ·åœ¨æ¯‹Æ¡JDBC调用后,都会ä¸ÕdŠ¨çš„é‡Šæ”¾è¿žæŽ? 对于非JTA的连æŽ? 使用在每个事务结束时释放˜qžæŽ¥æ˜¯åˆç†çš„. ž®†äØ“JTAå’ŒCMT事务½{–略选择, 为JDBC事务½{–略选择. 取å€?/span> | | |
<propertyName> ž®†JDBC属æ€?tt class=literal>传递到中去.
<propertyName> ž®†å±žæ€?tt class=literal>传递到JNDI 中去.
Hibernate¾~“存属æ€?br>
属性名 用�
自定义的的类� 取�/span>
以频¾Jçš„è¯ÀL“ä½œäؓ代ä­h(hu¨¢n), 优化二çñ”¾~“存来最ž®åŒ–写操ä½? 在Hibernate3中,˜q™ä¸ªè®„¡½®å¯¹çš„集群¾~“存非常有用, 寚w›†¾Ÿ¤ç¼“存的实现而言åQŒé»˜è®¤æ˜¯å¼€å¯çš„. 取å€?/span>
允许查询¾~“å­˜, 个别查询仍然需要被讄¡½®ä¸ºå¯¾~“å­˜çš? 取å€?/span>
能用来完全禁止ä‹É用二¾U§ç¼“å­? 寚w‚£äº›åœ¨¾cÈš„æ˜ å°„定义中指å®?tt class=literal>的类åQŒä¼šé»˜è®¤å¼€å¯äºŒ¾U§ç¼“å­? 取å€?/span>
自定义实�tt class=literal>接口的类� 默认为内建的. 取�/span>
二çñ”¾~“存区域名的前缀. 取å€?/span>
强制Hibernate以更人性化的格式将数据存入二çñ”¾~“å­˜. 取å€?/span>
Hibernate事务属�br>
属性名 用�
一�tt class=literal>的类� 用于Hibernate API (默认�tt class=literal>). 取�/span>
一个JNDI名字åQŒè¢«ç”¨æ¥ä»Žåº”用服务器获取JTA . 取å€?/span>
一ä¸?tt class=literal>的类å?- 当ä‹É用JVM¾U§ç¼“存,或在JTA环境中ä‹É用hilo生成器的时候需要该¾c? 取å€?/span>
如果开å? session在事务完成后ž®†è¢«è‡ªåŠ¨æ¸…æ´—(flush)ã€?现在更好的方法是使用自动session上下文管理ã€?span class=strong>取å€?/span> |
如果开å? session在事务完成后ž®†è¢«è‡ªåЍ关闭ã€?现在更好的方法是使用自动session上下文管理ã€?span class=strong>取å€?/span> |
其他属�br>
属性名 用�
ä¸?当前" 指定一ä¸?自定义的)½{–ç•¥ã€?span class=strong>eg. | |
选择HQL解析器的实现. 取�/span> or
ž®†Hibernate查询中的½W¦å·æ˜ å°„到SQL查询中的½W¦å· (½W¦å·å¯èƒ½æ˜¯å‡½æ•°åæˆ–常量名å­?. 取å€?/span>
åœ?tt class=literal>创徏æ—Óž¼Œè‡ªåЍ‹‚€æŸ¥æ•°æ®åº“¾l“æž„åQŒæˆ–者将数据库schemaçš„DDL导出到数据库. 使用 æ—?在显式关é—?tt class=literal>æ—Óž¼Œž®†drop掉数据库schema. 取å€?/span> | | |
开启CGLIB来替代运行时反射机制(¾pȝ»Ÿ¾U§å±žæ€?. 反射机制有时在除错时比较有用. 注意即ä‹É关闭˜q™ä¸ªä¼˜åŒ–, Hibernate˜q˜æ˜¯éœ€è¦CGLIB. 你不能在中设¾|®æ­¤å±žæ€? 取å€?/span> |
SQL方言

你应当æ€ÀL˜¯ä¸ÞZ½ çš„æ•°æ®åº“ž®?tt class=literal>属性设¾|®æˆæ­£ç¡®çš?子类. 如果你指定一¿Uæ–¹­a€, Hibernatež®†äؓ上面列出的一些属性ä‹É用合理的默认å€? ä¸ÞZ½ çœåŽ»äº†æ‰‹å·¥æŒ‡å®šå®ƒä»¬çš„åŠŸå¤«.

Hibernate SQL方言 ()
RDBMS 方言
DB2
DB2 AS/400
DB2 OS390
PostgreSQL
MySQL
MySQL with InnoDB
MySQL with MyISAM
Oracle (any version)
Oracle 9i/10g
Sybase
Sybase Anywhere
Microsoft SQL Server
SAP DB
Informix
HypersonicSQL
Ingres
Progress
Mckoi SQL
Interbase
Pointbase
FrontBase
Firebird
Hibernate日志¾cÕdˆ«
¾cÕdˆ« 功能
在所有SQL DML语句被执行时为它们记录日�
为所有JDBC参数记录日志
在所有SQL DDLè¯­å¥æ‰§è¡Œæ—¶äØ“å®ƒä»¬è®°å½•æ—¥å¿—
在session清洗(flush)æ—Óž¼Œä¸ºæ‰€æœ‰ä¸Žå…¶å…³è”的实体(最å¤?0ä¸?的状态记录日å¿?
为所有二¾U§ç¼“存的‹zÕdŠ¨è®°å½•æ—¥å¿—
ä¸ÞZº‹åŠ¡ç›¸å…³çš„‹zÕdŠ¨è®°å½•æ—¥å¿—
为所有JDBC资源的获取记录日�
在解析查询的时�记录HQL和SQL的AST分析日志
为JAAS认证è¯äh±‚做日å¿?
ä¸ÞZ“Q何Hibernate相关信息做日å¿?(信息量较å¤? 但对查错非常有帮åŠ?
 JTA TransactionManagers
Transaction工厂¾c? 应用½E‹åºæœåŠ¡å™?
JBoss
Weblogic
WebSphere
WebSphere 6
Orion
Resin
JOTM
JOnAS
JRun4
Borland ES
原文地址åQ?a >http://www.ideagrace.com/html/doc/2007/01/30/08608.html


]]>
Open Session in Test 及自动Rollbackhttp://www.aygfsteel.com/rain1102/archive/2007/05/15/117541.htmlEric.ZhouEric.ZhouTue, 15 May 2007 03:09:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/05/15/117541.htmlhttp://www.aygfsteel.com/rain1102/comments/117541.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/05/15/117541.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/117541.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/117541.html 
如果不能¾l§æ‰¿äºŽè¿™ä¸ªåŸº¾c»ï¼Œå¯ä»¥è‡ªå·±½Ž€å•编写,代码是这æ ïL(f¨¥ng)š„åQ?br>   protected PlatformTransactionManager transactionManager;
   protected TransactionStatus transactionStatus;
   protected boolean defaultRollback = true;
   public void setUp()
   {
        transactionManager = (PlatformTransactionManager) ctx.getBean("transactionManager");
        transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
   }
   public void tearDown()
   {
        if (defaultRollback)
            transactionManager.rollback(this.transactionStatus);
        else
           transactionManager.commit(this.transactionStatus);
    }
(注,hibernate太奸诈了åQŒå¦‚果全部默认回滚,只会在session里干‹z»ï¼Œä¸€ç‚¹ä¸å†™æ•°æ®åº“åQŒè¾¾ä¸åˆ°å®Œå…¨çš„æµ‹è¯•效果ã€?

]]>
关于Spring中的回滚问题AbstractTransactionalDataSourceSpringContextTestshttp://www.aygfsteel.com/rain1102/archive/2007/05/15/117518.htmlEric.ZhouEric.ZhouTue, 15 May 2007 02:06:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/05/15/117518.htmlhttp://www.aygfsteel.com/rain1102/comments/117518.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/05/15/117518.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/117518.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/117518.htmlHibernateTemaplate.executeWithSession(...){
public Object doInHibernate(Session session) {
runTest();
session.flush();//synchornize database, errors will be reported.
session.clear();}...}
而AbstractTransactionalDataSourceSpringContextTests只要你不调用super.setDefaultRollback(false);˜q™ä¸ªåŸºç±»é»˜è®¤ž®×ƒ¼šå›žæ»š! 于是由此产生hibernateåäh‡’,无法发现数据库操ä½?ç„¶åŽæˆ‘ä»¬å»ø™®®ä½ åœ¨‹¹‹è¯•中显½Cø™°ƒç”¨session.flush
或者参杂一些查询调ç”?其实也是ä¸ÞZº†è§¦å‘session.flush)ã€?/p>

不过˜q™é‡Œé¢ä¹Ÿæœ‰äº›é™·é˜±:如果你的‹¹‹è¯•˜q˜æ˜¯ä¼šæŠŠæ•°æ®å†™å…¥äº†æ•°æ®åº“的话,可能是由于你加蝲的spring配置文äšg里有多个事务½Ž¡ç†å™¨æˆ–session工厂,从而导致AbstractTransactionalDataSourceSpringContextTests没有获得正确的TransactionManager或SessionFactory,所以就没能回滚不过˜q™ç§é”™è¯¯ä¹Ÿä¸å¤ªå®¹æ˜“犯,因䨓AbstractTransactionalDataSourceSpringContextTests默认按类型组è£?如果她发现有多个TransactionManager¾cÕdž‹çš„bean是要报错çš?此时你需要调用setAutowireMode(this.AUTOWIRE_BY_NAME);使其按名¿U°ç»„装ã€?br>
另外值得注意的是åQŒä‹É用MYSQL时候表的类型选择。例å¦?/p>

CREATE TABLE `myisam` (
  `id` 
int(11NOT NULL auto_increment,
  `name` 
varchar(100default NULL,
  `content` 
text,
  
PRIMARY KEY  (`id`)
) ENGINE
=MyISAM DEFAULT CHARSET=gbk;
˜q™æ—¶å€™åº”该把¾cÕdž‹æ”¹äØ“InnoDBã€?/span>

MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎åQ?#183; MyISAM½Ž¡ç†éžäº‹åŠ¡è¡¨ã€‚å®ƒæä¾›é«˜é€Ÿå­˜å‚¨å’Œ‹‚€ç´¢ï¼Œä»¥åŠå…¨æ–‡æœçƒ¦èƒ½åŠ›ã€‚MyISAM在所有MySQL配置里被支持åQŒå®ƒæ˜¯é»˜è®¤çš„存储引擎åQŒé™¤éžä½ é…ç½® MySQL默认使用另外一个引擎ã€?·MEMORY存储引擎提供“内存ä¸?#8221;表。MERGE存储引擎允许集合ž®†è¢«å¤„理同样的MyISAM表作ä¸ÞZ¸€ä¸ªå•独的表。就像MyISAMä¸€æ øP¼Œ MEMORYå’ŒMERGE存储引擎处理非事务表åQŒè¿™ä¸¤ä¸ªå¼•擎也都被默认包含在MySQL中ã€?释:MEMORY存储引擎正式地被¼‹®å®šä¸ºHEAP引擎ã€?#183; InnoDBå’ŒBDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系¾lŸå‘布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或¼›æ­¢ä»ÖM¸€å¼•擎ã€?#183;EXAMPLE存储引擎是一ä¸?#8220;存根”引擎åQŒå®ƒä¸åšä»€ä¹ˆã€‚你可以用这ä¸?引擎创徏表,但没有数据被存储于其中或从其中检索ã€?/span>



]]>
Hibernate中的多对多映ž®?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/rain1102/archive/2007/04/10/109628.html</guid><wfw:comment>http://www.aygfsteel.com/rain1102/comments/109628.html</wfw:comment><comments>http://www.aygfsteel.com/rain1102/archive/2007/04/10/109628.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/rain1102/comments/commentRss/109628.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/rain1102/services/trackbacks/109628.html</trackback:ping><description><![CDATA[Payment.java<br><br><span style="COLOR: #003300">private Set<Subscription> subscriptions = new HashSet<Subscription>(0);</span><br><br>Subscription.java<br><br><span style="COLOR: #003300"> private Set<Payment> payments = new HashSet<Payment>(0);</span><br><br>Payment.hbm.xml<br><br><span style="COLOR: #003300"><set name="subscriptions" table="subscriptionpayment" inverse="false"<br>   cascade="none"><br>   <key><br>    <column name="PaymentID" /><br>   </key><br>   <many-to-many class="com.test.eric.model.Subscription"><br>    <column name="SubscriptionID" /><br>   </many-to-many><br> </set></span><br><br>Subscription.hbm.xml<br><br><span style="COLOR: #003300"><set name="payments" table="subscriptionpayment" inverse="false"<br>   cascade="none"><br>   <key><br>    <column name="SubscriptionID" /><br>   </key><br>   <many-to-many class="com.test.eric.model.Payment"><br>    <column name="PaymentID" /><br>   </many-to-many><br> </set></span><img src ="http://www.aygfsteel.com/rain1102/aggbug/109628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/rain1102/" target="_blank">Eric.Zhou</a> 2007-04-10 14:31 <a href="http://www.aygfsteel.com/rain1102/archive/2007/04/10/109628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中的主键生成æ–ÒŽ(gu¨©)³•native与assignedhttp://www.aygfsteel.com/rain1102/archive/2007/04/04/108395.htmlEric.ZhouEric.ZhouWed, 04 Apr 2007 03:46:00 GMThttp://www.aygfsteel.com/rain1102/archive/2007/04/04/108395.htmlhttp://www.aygfsteel.com/rain1102/comments/108395.htmlhttp://www.aygfsteel.com/rain1102/archive/2007/04/04/108395.html#Feedback1http://www.aygfsteel.com/rain1102/comments/commentRss/108395.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/108395.html<generator class="native"></generator>
而当是自己添加的时候则需要改为assigned�br><generator class="assigned"></generator>
否则ž®†ä¼šå‡ºçް异叏åQ?img src ="http://www.aygfsteel.com/rain1102/aggbug/108395.html" width = "1" height = "1" />

]]>
WSH(webwork+spring+hibernate)+mysqlhttp://www.aygfsteel.com/rain1102/archive/2006/12/19/88796.htmlEric.ZhouEric.ZhouTue, 19 Dec 2006 06:55:00 GMThttp://www.aygfsteel.com/rain1102/archive/2006/12/19/88796.htmlhttp://www.aygfsteel.com/rain1102/comments/88796.htmlhttp://www.aygfsteel.com/rain1102/archive/2006/12/19/88796.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/88796.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/88796.html web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<web-app>
    <display-name>Third Team</display-name>

<!--   <filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>com.founder.study.forum.helper.FilterChar</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
 </filter>-->
    <filter>
        <filter-name>webwork</filter-name>
        <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    </filter>
<!--   <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 <filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>-->
    <filter-mapping>
        <filter-name>webwork</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <!--
        This typically isn't required, as the taglib is included in webwork.jar.
        If you really need a taglib configuration within web.xml, copy webwork/src/java/META-INF/taglib.tld
        to the WEB-INF directory as webwork.tld.
     -->
    <taglib>
        <taglib-uri>webwork</taglib-uri>
        <taglib-location>/WEB-INF/lib/webwork-2.2.4.jar</taglib-location>
    </taglib>
    <!-- <taglib>
  <taglib-uri>sitemesh-decorator</taglib-uri>
  <taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location>
 </taglib>
 <taglib>
  <taglib-uri>sitemesh-page</taglib-uri>
  <taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location>
 </taglib>-->
</web-app>

xwork.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "
http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">

<xwork>
 <include file="webwork-default.xml" />
   
 <package name="default" extends="webwork-default">
    
     <interceptors>
         <interceptor-stack name="modelParamsStack">
           <interceptor-ref name="model-driven" />
            <interceptor-ref name="params" />
         </interceptor-stack>
     </interceptors>
    
  
 </package>
</xwork>

webwork.properties
webwork.objectFactory = spring
webwork.devMode = true
webwork.tag.altSyntax=true
webwork.locale=zh_CN
webwork.i18n.encoding=UTF-8
webwork.custom.i18n.resources=com.founder.study.forum.resource.ApplicationResources

jdbc.properties
# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "applicationContext-*.xml".
# Targeted at system administrators, to avoid touching the context XML files.

jdbc.driverClassName=org.gjt.mm.mysql.Driver
jdbc.url=jdbc:mysql://localhost:3306/forum?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root


hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "

<beans default-autowire="byName">
<!-- JDBC Config /author Jerome_mao-->
 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="/WEB-INF/jdbc.properties" />
 </bean>
<!-- Config DateSource /author Jerome_mao-->
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driverClassName}" />
  <property name="url" value="${jdbc.url}" />
  <property name="username" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
 </bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" singleton="true">
 <property name="dataSource">
  <ref local="dataSource" />
 </property>
   <property name="mappingResources">
  <list>
   <value>com/founder/study/forum/model/Threadgroups.hbm.xml</value>
   <value>com/founder/study/forum/model/User.hbm.xml</value>
   <value>com/founder/study/forum/model/Userrole.hbm.xml</value>
  </list>
 </property>
<property name="hibernateProperties">
  <props>
   <prop key="hibernate.dialect">${hibernate.dialect}</prop>
   <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<!--   <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>-->
  </props>
</property> 
</bean>
 
 <!-- Hibernate transaction processing /author Jerome_mao-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 <property name="sessionFactory">
  <ref local="sessionFactory" />
 </property>
</bean>

<!-- commerce logic service config -->
<!-- User Service  /author Jerome_mao-->
<bean id="userService" class="com.founder.study.forum.service.impl.UserServiceImpl">
 <property name="userDAO">
  <ref bean="userDAO"/>
 </property>
</bean>
<!-- Data persistent layer  -->
<!-- User login   /author Jerome_mao -->
<bean id="userDAO" class="com.founder.study.forum.dao.hibernate.UserDAOHibernate">
 <property name="sessionFactory">
  <ref local="sessionFactory" />
 </property>
</bean>
<bean id="forumService" class="com.founder.study.forum.service.impl.ForumServiceImpl">
  <property name="forumTypeDAO">
    <ref local="forumTypeDAO"/>
  </property>
</bean>
<bean id="forumTypeDAO" class="com.founder.study.forum.dao.hibernate.ForumTypeDAOHibernate">
  <property name="sessionFactory">
    <ref local="sessionFactory"/>
  </property>
</bean>
<bean id="messageService" class="com.founder.study.forum.service.impl.MessageServiceImpl">
  <property name="messageTypeDAO">
    <ref local="messageTypeDAO"/>
  </property>
</bean>
<bean id="messageTypeDAO" class="com.founder.study.forum.dao.hibernate.MessageTypeDAOHibernate">
   <property name="sessionFactory">
     <ref local="sessionFactory"/>
   </property>
</bean>
<bean id="adminService" class="com.founder.study.forum.service.impl.AdminServiceImpl">
  <property name="adminDAO">
    <ref local="adminDAO"/>
  </property>
</bean>
<bean id="adminDAO" class="com.founder.study.forum.dao.hibernate.AdminDAOHibernate">
   <property name="sessionFactory">
     <ref local="sessionFactory"/>
   </property>
</bean>
</beans>



]]>
webwork+spring+hibernate架构目录¾l“æž„http://www.aygfsteel.com/rain1102/archive/2006/12/11/86877.htmlEric.ZhouEric.ZhouMon, 11 Dec 2006 05:21:00 GMThttp://www.aygfsteel.com/rain1102/archive/2006/12/11/86877.htmlhttp://www.aygfsteel.com/rain1102/comments/86877.htmlhttp://www.aygfsteel.com/rain1102/archive/2006/12/11/86877.html#Feedback0http://www.aygfsteel.com/rain1102/comments/commentRss/86877.htmlhttp://www.aygfsteel.com/rain1102/services/trackbacks/86877.html

     è½¬è‡ªhttp://www.aygfsteel.com/black_zerg/archive/2005/05/30/5327.html 

       åœ?/span> src ç›®å½•ä¸‹äØ“ Java 源码

dao    负责数据讉K—®å¯¹è±¡çš„定义和实现

  其中 Dao ¾l“尾为接口, Impl ¾l“尾为实现。目前一般用 hibernate 做实现ã€?br /> domain 实体对象

logic   针对实体对象ž®è£…的逻辑

  ˜q™é‡Œ service 是外观接口, serviceimpl 是实玎ͼŒè€ƒè™‘目前情况½Ž€å•,òq¶æ²¡æœ‰è¿›ä¸€æ­¥åˆ†¼›»é€»è¾‘åQŒä¸šåŠ¡é€»è¾‘éƒ½åœ¨ impl 中完成ã€?/span>

web    界面相关çš?/span> Java ¾c?/span>

  common 是一些常用类åQŒå¦‚处理中文问题çš?/span> filter.

  displaytag 中放äº?/span> displaytag 相关的类åQŒå¤šä¸?/span> wrapper.

  webwork 中都是对应的 action åQ?/span>

其中 BaseAction 是基本的抽象¾c»ï¼ŒåŸºæœ¬åŽç®‹å¼€å‘应¾l§æ‰¿æ­¤ç±»

CrudAction æ˜¯äØ“äº†ä¸€èˆ¬çš„ Crud 工作而作的一个抽象类åQŒå¯ä»¥ç‘ô承用来简化工作ã€?/span>

è€?/span> CaseDispatcher 负责菜单点击后分发到相关 Action åQŒåŒæ—¶å¤„理权限和 session 工作ã€?br />  å…¶ä»– action 按模块进行了¾l„织

左边�/span> webroot 的结�/span>

 

 

重要的配¾|®æ–‡ä»¶æœ‰åQ?/span>

Spring

applicationContext.xml

applicationContext-db.xml

Webwork

xwork.xml

webwork.properties

i18n

 labels.properties

log4j

 log4j.properties

displaytag

 displaytag.properties

dbConnect

 jdbc.properties

 

关于一些技术难点和¾l†èŠ‚åQ?/span>

1åQ?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  各框架连接: spring åˆ?/span> hibernate 使用 spring çš?/span> hibernate 支持ã€?/span> Spring åˆ?/span> webwork 使用 autoware 的拦截机制自动装配ã€?/span>

2åQ?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  列表的问题,采用 displaytag 。功能强大,使用½Ž€‹zï¼Œå¯å®žçŽ°æŽ’åºå’Œæ•°æ®å¯¼å‡ºã€?/span>

3åQ?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  数据下蝲åQŒä‹Éç”?/span> displaytag 自带çš?/span> excel 下蝲

4åQ?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  æ–‡äšg上传åQŒä‹Éç”?/span> webwork 提供的解å†Ïx–¹æ¡ˆï¼Œç”¨æ‹¦æˆªæœºåˆ¶å®žçްã€?/span>

5åQ?/span> jsp 代码¾l„织斚w¢åQŒæˆ‘们ä‹Éç”?/span> taglib å’?/span> css 技术ä‹É jsp 中页面逻辑减少到最ž®ï¼Œä¸€èˆ¬æƒ…况完全可以不使用 <% %> çš?/span> script ŒD?/span> 。同时我们ä‹É用两ä¸?/span> include 来包含常用的 taglib 定义åQ?/span> js 引用å’?/span> html ¾l“æž„åQŒä‹É jsp 代码非常½Ž€‹zã€?/span>

6åQ?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  中文问题 我们使用 filter 来解决页é?/span> gbk åˆ?/span> Java ½E‹åº unicode çš„è{换,同时通过正确的设¾|®æ•°æ®åº“˜qžæŽ¥ url 完成和数据库之间的交互ã€?/span>

7åQ?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  I18n 国际化。我们要求在 jsp 代码中不出现中文åQŒæ‰€æœ‰æ½CÞZ¿¡æ¯éƒ½é€šè¿‡èµ„源文äšg labels.properties 来完成。页面中可以使用 jstl æˆ?/span> webwork 标签来调用ã€?/span>

8åQ?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">  界面验证问题。ä‹Éç”?/span> webwork çš?/span> validate 机制ç”?/span> xml 定义åQŒæˆ–åœ?/span> action 中代码判断ã€?/span>



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º °²Â½ÊÐ| ×ñÒåÊÐ| ÎâÖÒÊÐ| ÎÂÖÝÊÐ| ÎäÉ½ÏØ| Áô°ÓÏØ| ÙðÖÝÊÐ| ʯÁÖ| ¸ßÌÆÏØ| ½­°²ÏØ| ¾°¹È| ¿ÂÆºÏØ| ¹ÛÌÁÇø| ¸Õ²ìÏØ| ÔúÂ³ÌØÆì| éŽ­ÏØ| ¼ªÂ¡ÏØ| µÃÈÙÏØ| ±±Æ±ÊÐ| °×³ÇÊÐ| ÃÅÍ·¹µÇø| »ëÔ´ÏØ| ÈÕÍÁÏØ| ºÓÄÏÊ¡| »ÆÆÖÇø| ÈðÀöÊÐ| ¹ðƽÊÐ| ÎÂÖÝÊÐ| ÑÎÔ´ÏØ| À¶É½ÏØ| Ì«¹ÈÏØ| ¶ÑÁúµÂÇìÏØ| ±¦¼¦ÊÐ| µ±Í¿ÏØ| Áú´¨ÏØ| Òø´¨ÊÐ| ÜdzÇÏØ| »ªÈÝÏØ| ɨɽÊÐ| ¼ªÊ×ÊÐ| Â¡Ò¢ÏØ|