﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-HIBERNATE</title><link>http://www.blogjava.net/paulwong/category/11301.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 15 Jan 2022 00:37:33 GMT</lastBuildDate><pubDate>Sat, 15 Jan 2022 00:37:33 GMT</pubDate><ttl>60</ttl><item><title>JPA概要</title><link>http://www.blogjava.net/paulwong/archive/2016/06/04/430775.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 04 Jun 2016 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/06/04/430775.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/430775.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/06/04/430775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/430775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/430775.html</trackback:ping><description><![CDATA[<div id="content" style="margin: 0px; font-family: Times, serif; font-size: 16px; line-height: normal; orphans: 2; widows: 2; background-color: #f5f5f5;"><div id="outline-container-1" style="margin: 0px;"><h2><span style="margin: 0px; padding: 0px;">1</span>&nbsp;JPA概述</h2><div id="text-1" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA（Java Persistence API，Java持久化API），定义了对象-关系映射（ORM）以及实体对象持久化的标准接口。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA是JSR-220（EJB3.0）规范的一部分，在JSR-220中规定实体对象（EntityBean）由JPA进行支持。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">所以JPA不局限于EJB3.0，而是作为POJO持久化的标准规范，可以脱离容器独立运行，开发和测试更加方便。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA在应用中的位置如下图所示：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><img src="http://images.cnitblog.com/blog/376709/201212/30165055-6fb088fb97694402b0846c362e447e15.png" alt="" style="margin: 0px; padding: 0px; border: 0px; max-width: 900px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA维护一个Persistence Context（持久化上下文），在持久化上下文中维护实体的生命周期。主要包含三个方面的内容：</p><ol style="margin: 0px; padding: 0px 0px 0px 40px;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">ORM元数据。JPA支持annotion或xml两种形式描述对象-关系映射。</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">实体操作API。实现对实体对象的CRUD操作。</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">查询语言。约定了面向对象的查询语言JPQL（Java Persistence Query Language）。</li></ol><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA的主要API都定义在javax.persistence包中。如果你熟悉Hibernate，可以很容易做出对应：</p><table border="2" frame="hsides" rules="groups" cellspacing="0" cellpadding="6" style="margin: 0px; padding: 0px; border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: silver; word-break: break-word;"><caption style="margin: 0px; padding: 0px;">&nbsp;</caption><colgroup style="margin: 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"></colgroup><thead style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">org.hibernate</th><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">javax.persistence</th><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">说明</th></tr></thead><tbody style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">cfg.Configuration</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">Persistence</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">读取配置信息</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">SessionFactory</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">EntityManagerFactory</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">用于创建会话/实体管理器的工厂类</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">Session</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">EntityManager</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">提供实体操作API，管理事务，创建查询</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">Transaction</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">EntityTransaction</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">管理事务</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">Query</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">Query</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">执行查询</td></tr></tbody></table><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><img src="http://images.cnitblog.com/blog/376709/201212/30165114-588320c06f114b8c9ed6d849e5db2578.png" alt="" style="margin: 0px; padding: 0px; border: 0px; max-width: 900px;" /></p></div></div><div id="outline-container-2" style="margin: 0px;"><h2><span style="margin: 0px; padding: 0px;">2</span>&nbsp;实体生命周期</h2><div id="text-2" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">实体生命周期是JPA中非常重要的概念，描述了实体对象从创建到受控、从删除到游离的状态变换。对实体的操作主要就是改变实体的状态。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA中实体的生命周期如下图：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><img src="http://images.cnitblog.com/blog/376709/201212/30165131-da6d22c0db4b4943a0793235bd0b3531.png" alt="" style="margin: 0px; padding: 0px; border: 0px; max-width: 900px;" /></p><ol style="margin: 0px; padding: 0px 0px 0px 40px;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">New，新创建的实体对象，没有主键(identity)值</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">Managed，对象处于Persistence Context(持久化上下文）中，被EntityManager管理</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">Detached，对象已经游离到Persistence Context之外，进入Application Domain</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">Removed, 实体对象被删除</li></ol><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">EntityManager提供一系列的方法管理实体对象的生命周期，包括：</p><ol style="margin: 0px; padding: 0px 0px 0px 40px;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">persist, 将新创建的或已删除的实体转变为Managed状态，数据存入数据库。</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">remove，删除受控实体</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">merge，将游离实体转变为Managed状态，数据存入数据库。</li></ol><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">如果使用了事务管理，则事务的commit/rollback也会改变实体的状态。</p></div></div><div id="outline-container-3" style="margin: 0px;"><h2><span style="margin: 0px; padding: 0px;">3</span>&nbsp;实体关系映射（ORM）</h2><div id="outline-container-3-1" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">3.1</span>&nbsp;基本映射</h3><div id="text-3-1" style="margin: 0px;"><table border="2" frame="hsides" rules="groups" cellspacing="0" cellpadding="6" style="margin: 0px; padding: 0px; border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: silver; word-break: break-word;"><caption style="margin: 0px; padding: 0px;">&nbsp;</caption><colgroup style="margin: 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"></colgroup><thead style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">对象端</th><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">数据库端</th><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">annotion</th><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">可选annotion</th></tr></thead><tbody style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">Class</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">Table</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@Entity</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@Table(name="table<sub style="margin: 0px; padding: 0px;">name</sub>")</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">property</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">column</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">&#8211;</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@Column(name = "column<sub style="margin: 0px; padding: 0px;">name</sub>")</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">property</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">primary key</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@Id</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@GeneratedValue 详见ID生成策略</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">property</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">NONE</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@Transient</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">&nbsp;</td></tr></tbody></table></div></div><div id="outline-container-3-2" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">3.2</span>&nbsp;ID生成策略</h3><div id="text-3-2" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">ID对应数据库表的主键，是保证唯一性的重要属性。JPA提供了以下几种ID生成策略</p><ol style="margin: 0px; padding: 0px 0px 0px 40px;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">GeneratorType.AUTO ，由JPA自动生成</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">GenerationType.IDENTITY，使用数据库的自增长字段，需要数据库的支持（如SQL Server、MySQL、DB2、Derby等）</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">GenerationType.SEQUENCE，使用数据库的序列号，需要数据库的支持（如Oracle）</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">GenerationType.TABLE，使用指定的数据库表记录ID的增长 需要定义一个TableGenerator，在@GeneratedValue中引用。例如：<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">@TableGenerator( name="myGenerator", table="GENERATOR<sub style="margin: 0px; padding: 0px;">TABLE</sub>", pkColumnName = "ENTITY<sub style="margin: 0px; padding: 0px;">NAME</sub>", pkColumnValue="MyEntity", valueColumnName = "PK<sub style="margin: 0px; padding: 0px;">VALUE</sub>", allocationSize=1 )</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">@GeneratedValue(strategy = GenerationType.TABLE,generator="myGenerator")</p></li></ol></div></div><div id="outline-container-3-3" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">3.3</span>&nbsp;关联关系</h3><div id="text-3-3" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA定义了one-to-one、one-to-many、many-to-one、many-to-many 4种关系。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">对于数据库来说，通常在一个表中记录对另一个表的外键关联；对应到实体对象，持有关联数据的一方称为owning-side，另一方称为inverse-side。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">为了编程的方便，我们经常会希望在inverse-side也能引用到owning-side的对象，此时就构建了双向关联关系。 在双向关联中，需要在inverse-side定义mappedBy属性，以指明在owning-side是哪一个属性持有的关联数据。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">对关联关系映射的要点如下：</p><table border="2" frame="hsides" rules="groups" cellspacing="0" cellpadding="6" style="margin: 0px; padding: 0px; border-collapse: collapse; border-spacing: 0px; border-style: solid; border-color: silver; word-break: break-word;"><caption style="margin: 0px; padding: 0px;">&nbsp;</caption><colgroup style="margin: 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"><col style="margin: 0px auto 0px 0px; padding: 0px;"></colgroup><thead style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">关系类型</th><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">Owning-Side</th><th scope="col" style="margin: 0px auto 0px 0px; padding: 3px; border: 1px solid silver; border-collapse: collapse; vertical-align: top;">Inverse-Side</th></tr></thead><tbody style="margin: 0px; padding: 0px;"><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">one-to-one</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@OneToOne</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@OneToOne(mappedBy="othersideName")</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">one-to-many / many-to-one</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@ManyToOne</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@OneToMany(mappedBy="xxx")</td></tr><tr style="margin: 0px; padding: 0px;"><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">many-to-many</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@ManyToMany</td><td style="margin: 0px auto 0px 0px; padding: 3px; border-style: solid; border-color: silver; border-collapse: collapse; vertical-align: top;">@ManyToMany(mappedBy ="xxx")</td></tr></tbody></table><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">其中 many-to-many关系的owning-side可以使用@JoinTable声明自定义关联表，比如Book和Author之间的关联表：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">@JoinTable(name = "BOOK<sub style="margin: 0px; padding: 0px;">AUTHOR</sub>", joinColumns = { @JoinColumn(name = "BOOK<sub style="margin: 0px; padding: 0px;">ID</sub>", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "AUTHOR<sub style="margin: 0px; padding: 0px;">ID</sub>", referencedColumnName = "id") })</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">关联关系还可以定制延迟加载和级联操作的行为（owning-side和inverse-side可以分别设置）：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">通过设置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER来决定关联对象是延迟加载或立即加载。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">通过设置cascade={options}可以设置级联操作的行为，其中options可以是以下组合：</p><ul style="margin: 0px 0px 0px 30px; padding: 0px; word-break: break-all;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: disc;">CascadeType.MERGE 级联更新</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: disc;">CascadeType.PERSIST 级联保存</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: disc;">CascadeType.REFRESH 级联刷新</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: disc;">CascadeType.REMOVE 级联删除</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: disc;">CascadeType.ALL 级联上述4种操作</li></ul></div></div><div id="outline-container-3-4" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">3.4</span>&nbsp;继承关系</h3><div id="text-3-4" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA通过在父类增加@Inheritance(strategy=InheritanceType.xxx)来声明继承关系。A支持3种继承策略：</p><ol style="margin: 0px; padding: 0px 0px 0px 40px;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">单表继承（InheritanceType.SINGLE<sub style="margin: 0px; padding: 0px;">TABLE），所有继承树上的类共用一张表，在父类指定（</sub>@DiscriminatorColumn）声明并在每个类指定@DiscriminatorValue来区分类型。</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">类表继承（InheritanceType.JOINED），父子类共同的部分公用一张表，其余部分保存到各自的表，通过join进行关联。</li><li style="margin: 0px 0px 1em; padding: 0px; list-style: decimal;">具体表继承（InheritanceType.TABLE<sub style="margin: 0px; padding: 0px;">PER</sub><sub style="margin: 0px; padding: 0px;">CLASS</sub>)，每个具体类映射到自己的表。</li></ol><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">其中1和2能够支持多态，但是1需要允许字段为NULL，2需要多个JOIN关系；3最适合关系数据库，对多态支持不好。具体应用时根据需要取舍。</p></div></div></div><div id="outline-container-4" style="margin: 0px;"><h2><span style="margin: 0px; padding: 0px;">4</span>&nbsp;事件及监听</h2><div id="text-4" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;"><img src="http://images.cnitblog.com/blog/376709/201212/30165152-35787db2272041cfaa3ec31186f300f4.png" alt="" style="margin: 0px; padding: 0px; border: 0px; max-width: 900px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">通过在实体的方法上标注@PrePersist，@PostPersist等声明即可在事件发生时触发这些方法。</p></div></div><div id="outline-container-5" style="margin: 0px;"><h2><span style="margin: 0px; padding: 0px;">5</span>&nbsp;Query Language 查询语言</h2><div id="text-5" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA提供两种查询方式，一种是根据主键查询，使用EntityManager的find方法：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">T find(Class entityClass, Object primaryKey)</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">另一种就是使用JPQL查询语言。JPQL是完全面向对象的，具备继承、多态和关联等特性，和hibernate HQL很相似。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">使用EntityManager的createQuery方法：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Query createQuery(String qlString)</p></div><div id="outline-container-5-1" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">5.1</span>&nbsp;使用参数</h3><div id="text-5-1" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">可以在JPQL语句中使用参数。JPQL支持命名参数和位置参数两种参数，但是在一条JPQL语句中所有的参数只能使用同一种类型。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">举例如下：</p><ul style="margin: 0px 0px 0px 30px; padding: 0px; word-break: break-all;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: disc;">命令参数</li></ul><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Query query = em.createQuery("select p from Person p where p.personid=:Id"); query.setParameter("Id",new Integer(1));</p><ul style="margin: 0px 0px 0px 30px; padding: 0px; word-break: break-all;"><li style="margin: 0px 0px 1em; padding: 0px; list-style: disc;">位置参数</li></ul><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Query query = em.createQuery("select p from Person p where p.personid=?1"); query.setParameter(1,new Integer(1));</p></div></div><div id="outline-container-5-2" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">5.2</span>&nbsp;命名查询</h3><div id="text-5-2" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">如果某个JPQL语句需要在多个地方使用，还可以使用@NamedQuery 或者 @NamedQueries在实体对象上预定义命名查询。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">在需要调用的地方只要引用该查询的名字即可。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">例如：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">@NamedQuery(name="getPerson", query= "FROM Person WHERE personid=?1")</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">@NamedQueries({ @NamedQuery(name="getPerson1", query= "FROM Person WHERE personid=?1"), @NamedQuery(name="getPersonList", query= "FROM Person WHERE age&gt;?1") })</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Query query = em.createNamedQuery("getPerson");</p></div></div><div id="outline-container-5-3" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">5.3</span>&nbsp;排序</h3><div id="text-5-3" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPQL也支持排序，类似于SQL中的语法。例如： Query query = em.createQuery("select p from Person p order by p.age, p.birthday desc");</p></div></div><div id="outline-container-5-4" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">5.4</span>&nbsp;聚合查询</h3><div id="text-5-4" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPQL支持AVG、SUM、COUNT、MAX、MIN五个聚合函数。例如：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Query query = em.createQuery("select max(p.age) from Person p"); Object result = query.getSingleResult(); String maxAge = result.toString();</p></div></div><div id="outline-container-5-5" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">5.5</span>&nbsp;更新和删除</h3><div id="text-5-5" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPQL不仅用于查询，还可以用于批量更新和删除。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">如：</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Query query = em.createQuery("update Order as o set o.amount=o.amount+10"); //update 的记录数 int result = query.executeUpdate();</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Query query = em.createQuery("delete from OrderItem item where item.order in(from Order as o where o.amount&lt;100)"); query.executeUpdate();</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">query = em.createQuery("delete from Order as o where o.amount&lt;100"); query.executeUpdate();//delete的记录数</p></div></div><div id="outline-container-5-6" style="margin: 0px;"><h3><span style="margin: 0px; padding: 0px;">5.6</span>&nbsp;更多</h3><div id="text-5-6" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">与SQL类似，JPQL还涉及到更多的语法，可以参考：<a href="http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html" style="margin: 0px; padding: 0px; color: #0069d6; font-weight: inherit; line-height: inherit;">http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html</a></p></div></div></div><div id="outline-container-6" style="margin: 0px;"><h2><span style="margin: 0px; padding: 0px;">6</span>&nbsp;事务管理</h2><div id="text-6" style="margin: 0px;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA支持本地事务管理（RESOURCE<sub style="margin: 0px; padding: 0px;">LOCAL）和容器事务管理（JTA），容器事务管理只能用在EJB</sub>/Web容器环境中。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">事务管理的类型可以在persistence.xml文件中的&#8220;transaction-type&#8221;元素配置。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">JPA中通过EntityManager的getTransaction()方法获取事务的实例（EntityTransaction），之后可以调用事务的begin()、commit()、rollback()方法。</p></div></div></div><div id="postamble" style="margin: 0px; font-family: Times, serif; font-size: 16px; line-height: normal; orphans: 2; widows: 2; background-color: #f5f5f5;"><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Date: 2012-12-30 16:46:29 CST</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Author: Holbrook</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px;">Org version 7.8.11 with Emacs version 24</p></div><img src ="http://www.blogjava.net/paulwong/aggbug/430775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2016-06-04 16:08 <a href="http://www.blogjava.net/paulwong/archive/2016/06/04/430775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>S2SH链接不关闭</title><link>http://www.blogjava.net/paulwong/archive/2013/06/07/400353.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 07 Jun 2013 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/06/07/400353.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/400353.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/06/07/400353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/400353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/400353.html</trackback:ping><description><![CDATA[一套S2SH的应用，现用单线程，连续发1000个请求，用的DBCP链接池，结果报数据库链接不够用：<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->ERROR&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">org.hibernate.util.JDBCExceptionReporter</span><span style="color: #800000; font-weight: bold; ">]</span>&nbsp;-&nbsp;Cannot&nbsp;get&nbsp;a&nbsp;connection,&nbsp;pool&nbsp;error&nbsp;Timeout&nbsp;waiting&nbsp;for&nbsp;idle&nbsp;object</div><br />在JAVA加上LOG：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->log.info("active:&nbsp;"&nbsp;+&nbsp;dataSource.getNumActive()&nbsp;+&nbsp;"&nbsp;(max:&nbsp;"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;dataSource.getMaxActive()&nbsp;+&nbsp;")&nbsp;&nbsp;&nbsp;"&nbsp;+&nbsp;"idle:&nbsp;"&nbsp;+&nbsp;dataSource.getNumIdle()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"(max:&nbsp;"&nbsp;+&nbsp;dataSource.getMaxIdle()&nbsp;+&nbsp;")");</div><br />结果显示为：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->active:&nbsp;25&nbsp;(max:&nbsp;100)&nbsp;&nbsp;&nbsp;idle:&nbsp;0(max:&nbsp;30)</div><br />active的数量一直增加，但idle的数量一直为0。当程序向链接池要链接的时候，如果池没有，就会新建一个，active数就会加1，关闭链接后，链接会返回池，idle数加1。idle为0则表示池里没有链接。<br /><br />这样说明链接一直在创建，没有关闭放回池里。但链接是由SPRING和HIBERNATE管理的，代码中没有关闭链接的语句。之后试了N多配置，都还没解决，如增加maxActive数等。最后，加上这一行，问题才终于解决：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">prop&nbsp;</span><span style="color: #FF0000; ">key</span><span style="color: #0000FF; ">="hibernate.connection.release_mode"</span><span style="color: #0000FF; ">&gt;</span>after_transaction<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">prop</span><span style="color: #0000ff;">&gt;</span></div><br />这里默认值是auto，如果是用JTA事务才适用，如果是JDBC事务，就只能用after_transaction。<br /><br />这样每次事务结束后，就会关闭链接返回链接池。<br /><img src ="http://www.blogjava.net/paulwong/aggbug/400353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-06-07 15:09 <a href="http://www.blogjava.net/paulwong/archive/2013/06/07/400353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Tools</title><link>http://www.blogjava.net/paulwong/archive/2012/06/10/380435.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 10 Jun 2012 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/06/10/380435.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/380435.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/06/10/380435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/380435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/380435.html</trackback:ping><description><![CDATA[<p><span style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Hibernate Tools是由JBoss推出的一个Eclipse综合开发工具插件，该插件可以简化ORM框架Hibernate，以及JBoss Seam，EJB3等的开发工作。Hibernate Tools可以以Ant Task以及Eclipse插件的形式运行。<br /></span></p>
<h3>Hibernate Tools Eclipse插件的特征</h3>Hibernate Tools Eclipse插件具有以下特征或功能： <br /><strong>Mapping Editor（映射文件编辑器）：</strong>该编辑器可以用来编辑Hibernate XML映射文件，提供代码自动补全，语法高亮功能。 <br />- 类名的自动补全 <br />- 属性/表的列名自动补全 <br /><br /><strong>Hibernate Console（Hibernate控制台）：</strong>它提供一个全新的Eclipse Perspective窗口，可以执行HQL，并查看查询的结果。这是一个非常便利的工具，可以用来验证HQL的语法是否正确。 <br /><br /><strong>Configuration Wizards and Code generation（Hibernate配置文件hibernate.cfg.xml创建导航，以及代码生成器）：</strong>支 持完全反向生成功能，可以从已有的数据库生成Hibernate配置文件hibernate.cfg.xml，同时支持"click-and- generate"方式生成Java代码(Hibernate POJOs)，DAO，XML映射文件（.hbm.xml），以及schema 文档（.hml）等文件。 <br /><br /><strong>Eclipse JDT integration（代码补全）：</strong>该工具支持Java代码中的HQL输入补全，以及对Java代码中的HQL语法加以合法性验证。 <br />
<h3>Hibernate Tools的使用</h3><strong>- Hibernate的配置文件hibernate.cfg.xml的生成</strong> <br />步骤： <br />1）Eclipse的菜单：选择[File] -&gt; [New] -&gt; [Other] -&gt; [Hibernate/Hibernate Configuration file (cfg.xml) ]，&#8220;Next&#8221;按钮 <br />2）输入 [Database dialect] ，[Driver Class]，[Connection URL]，以及[DB用户名]，[密码]等 <br />3）按下[Finish]按钮，则自动生成hibernate.cfg.xml文件。 <br />** "Create Console Configuration" checkbox默认为选择状态。被选择的情况下，则进入&#8220;Hibernate Console Configuration &#8221;（Hibernate Console）设置/创建页面。 <br /><strong><br />- 设置Hibernate Console</strong> <br />Hibernate Tools支持创建多个Hibernate Console。 <br />1）Eclipse菜单：选择[File] -&gt; [New] -&gt; [Other] -&gt; [Hibernate/Hibernate Console Configuration]，&#8220;Next&#8221;按钮 <br />2）在所显示的画面上输入Hibernate Console的名称[Name]，目标项目名[Project]，Hibernate配置文件（hibernate.cfg.xml）的路径[Configuration file] <br />3）按[Finish]按钮，则创建Hibernate Console，同时显示在"Hibernate Configurations"视图中。 <br /><br /><strong>- Reverse engineering and code generation：</strong>利用"click-and-generate" Reverse Engineering以及代码生成功能自动生成所需代码。 <br />&#8251;使用Hibernate code generation（Hibernate代码生成器）之前，需要先配置/创建Hibernate Console。 <br />1）可以从Hibernate 的Tool Bar，或"Run/Hibernate Code Generation"菜单启动Hibernate代码生成器。 <br />2）在所显示的画面上，输入 创建好的Hibernate控制台名称[Console Configuration]，输出路径「Output directory」等信息。 <br />** 其它可以实际情况加以设置。 <br />3）打开Explore标签，设置需要生成的代码类型（Domain code, DAO等） <br />4）设置完成之后，按下[Run]按钮 <br />根据不同的配置，将自动生成Hibernate关联文件，EJB3，JBoss Seam等文件。 <br />
<h3>Hibernate Tools其它参考资料</h3><a href="http://www.hibernate.org/hib_docs/tools/reference/en/html/" rel="nofollow" target="blank">Hibernate Tools Reference Guide</a>&nbsp; [官方文档] <br /><a href="http://www.hibernate.org/hib_docs/tools/reference/en/html/plugins.html" rel="nofollow">Hibernate Tools Eclipse Plugins</a>&nbsp; [官方文档，Hibernate Tools Eclipse插件]<img src ="http://www.blogjava.net/paulwong/aggbug/380435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-06-10 10:21 <a href="http://www.blogjava.net/paulwong/archive/2012/06/10/380435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库的锁机制</title><link>http://www.blogjava.net/paulwong/archive/2012/04/19/375298.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 19 Apr 2012 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/04/19/375298.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/375298.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/04/19/375298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/375298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/375298.html</trackback:ping><description><![CDATA[<div>在进行SELECT操作时，通常接下来会进行UPADTE的操作，如果希望COMMIT前，所SELECT的数据不会被其他线程SELECT出来，则两个线程都加FOR UPDATE/FOR UPDATE NOWAIT关键字，这样数据库就会锁定这些记录，加了FOR UPDATE的会进行等待，直到上一线程结束，加了FOR UPDATE NOWAIT的线程则直接抛出异常，这种机制称为数据库的锁机制。</div><br />HIBERNATE中的实现：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">LockMode.NONE&nbsp;：有缓存用缓存，没缓存则从数据库读&nbsp;<br />LockMode.READ&nbsp;：直接从数据库读，不使用缓存数据&nbsp;<br />LockMode.WRITE&nbsp;：在insert&nbsp;update数据的时候，HIBERNATE内部使用的。&nbsp;<br />以上3种均为HIBERNATE级别的锁，也就是缓存级别的锁。&nbsp;<br /><br />下面2种为数据库级别的锁：&nbsp;<br />LockMode.UPGRADE：相当于SQL语句select&nbsp;for&nbsp;update，被select的数据都被数据库锁住了，不能被其他事务修改。&nbsp;<br />LockMode.&nbsp;UPGRADE_NOWAIT&nbsp;：是ORACLE数据库特有的select&nbsp;for&nbsp;update&nbsp;nowait</span></div><img src ="http://www.blogjava.net/paulwong/aggbug/375298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-04-19 17:56 <a href="http://www.blogjava.net/paulwong/archive/2012/04/19/375298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Using an Example of Sharding with Hibernate </title><link>http://www.blogjava.net/paulwong/archive/2012/01/04/367875.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 04 Jan 2012 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/01/04/367875.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/367875.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/01/04/367875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/367875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/367875.html</trackback:ping><description><![CDATA[<div>AMAZON的关于HIBERNATE SHARD的例子：<br /><a href="http://aws.amazon.com/articles/0040302286264415" target="_blank">http://aws.amazon.com/articles/0040302286264415</a></div><img src ="http://www.blogjava.net/paulwong/aggbug/367875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-01-04 23:21 <a href="http://www.blogjava.net/paulwong/archive/2012/01/04/367875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HIBERNATE SHARD</title><link>http://www.blogjava.net/paulwong/archive/2012/01/04/367869.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 04 Jan 2012 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/01/04/367869.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/367869.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/01/04/367869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/367869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/367869.html</trackback:ping><description><![CDATA[数据上千万，都挤在一个表里，导致查询太慢？分库分表洛！但已经用了HIBERNATE了，不想转其他框架？用HIBERNATE SHARD!<br /><br />在向大家详细介绍Hibernate Shard三种策略之前，首先让大家了解下Hibernate Shard简介，然后全面介绍Hibernate Shard三种策略。 <br /><br /><strong>1. Hibernate Shard简介</strong> <br />Hibernate Shard多数据库水平分区解决方案。Hibernate 的一个扩展，用于处理多数据库水平分区架构。由google工程师 2007年 捐献给 Hibernate社区。目前版本： 3.0.0 beta2， 未发GA版。条件：Hibernate Core 3.2， JDK 5.0 <br /><br /><strong>2. 水平分区原理</strong> <br />一个库表如 Order 存在于多个数据库实例上。按特定的分区逻辑，将该库表的数据存储在这些实例中，一条记录的主键 PK，在所有实例中不得重复。水平分区在大型网站，大型企业应用中经常采用。目的出于海量数据分散存储，分散操作，分散查询以便提高数据处理量和整体数据处理性能。使用：google工程师的设计还是非常好的，完全兼容 Hibernate本身的主要接口。 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">org.hibernate.Session&nbsp;&nbsp;<br />&nbsp; org.hibernate.SessionFactory&nbsp;&nbsp;<br />&nbsp; org.hibernate.Criteria&nbsp;&nbsp;<br />&nbsp; org.hibernate.Query&nbsp;</span></div><br />因此程序员开发变化不大，甚至不需要关心后台使用了分区数据库。程序迁移问题不大。而且配置上比较简明。 <br /><br /><strong>3. Hibernate Shard三种策略：</strong> <br />&#9670;ShardAccessStrategy， 查询操作时，到那个分区执行。默认提供两个实现：<br />顺序策略：SequentialShardAccessStrategy， 每个query按顺序在所有分区上执行。<br />平行策略：ParallelShardAccessStrategy， 每个query以多线程方式并发平行的在所有分区上执行。此策略下，需要使用线程池机制满足特定的性能需要，java.util.concurrent.ThreadPoolExecutor. <br /><br />&#9670;ShardSelectionStrategy， 新增对象时，存储到哪个分区。框架默认提供了一个轮询选择策略 RoundRobinShardSelectionStrategy， 但一般不这样使用。通常采用&#8220;attribute-based sharding&#8221;机制，基于属性分区。一般是用户根据表自己实现一个基于属性分区的策略类ShardSelectionStrategy ，例如，以下WeatherReport基于continent属性选择分区： &nbsp; 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img id="Codehighlighter1_83_287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_83_287_Open_Text.style.display='none'; Codehighlighter1_83_287_Closed_Image.style.display='inline'; Codehighlighter1_83_287_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_83_287_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_83_287_Closed_Text.style.display='none'; Codehighlighter1_83_287_Open_Image.style.display='inline'; Codehighlighter1_83_287_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;WeatherReportShardSelectionStrategy&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ShardSelectionStrategy&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_83_287_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_83_287_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br /><img id="Codehighlighter1_140_285_Open_Image" onclick="this.style.display='none'; Codehighlighter1_140_285_Open_Text.style.display='none'; Codehighlighter1_140_285_Closed_Image.style.display='inline'; Codehighlighter1_140_285_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_140_285_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_140_285_Closed_Text.style.display='none'; Codehighlighter1_140_285_Open_Image.style.display='inline'; Codehighlighter1_140_285_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ShardId&nbsp;selectShardIdForNewObject(Object&nbsp;obj)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_140_285_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_140_285_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(obj&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;WeatherReport)&nbsp;<br /><img id="Codehighlighter1_178_241_Open_Image" onclick="this.style.display='none'; Codehighlighter1_178_241_Open_Text.style.display='none'; Codehighlighter1_178_241_Closed_Image.style.display='inline'; Codehighlighter1_178_241_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_178_241_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_178_241_Closed_Text.style.display='none'; Codehighlighter1_178_241_Open_Image.style.display='inline'; Codehighlighter1_178_241_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_178_241_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_178_241_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((WeatherReport)obj).getContinent().getShardId();&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalArgumentException();&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />}</span></span><span style="color: #000000">&nbsp;</span></div></span><br />&#9670;ShardResolutionStrategy， 该策略用于查找单个对象时，判断它在哪个或哪几个分区上。默认使用 AllShardsShardResolutionStrategy ，可以自定义例如：&nbsp;&nbsp; <br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> WeatherReportShardResolutionStrategy </span><span style="color: #0000ff">extends</span><span style="color: #000000"> AllShardsShardResolutionStrategy <br /><img id="Codehighlighter1_92_534_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_534_Open_Text.style.display='none'; Codehighlighter1_92_534_Closed_Image.style.display='inline'; Codehighlighter1_92_534_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_92_534_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_92_534_Closed_Text.style.display='none'; Codehighlighter1_92_534_Open_Image.style.display='inline'; Codehighlighter1_92_534_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_92_534_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_92_534_Open_Text"><span style="color: #000000">{ <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /> </span><span style="color: #0000ff">public</span><span style="color: #000000"> WeatherReportShardResolutionStrategy(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">ShardId</span><span style="color: #000000">&gt;</span><span style="color: #000000"> shardIds) <br /><img id="Codehighlighter1_167_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_167_192_Open_Text.style.display='none'; Codehighlighter1_167_192_Closed_Image.style.display='inline'; Codehighlighter1_167_192_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_167_192_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_167_192_Closed_Text.style.display='none'; Codehighlighter1_167_192_Open_Image.style.display='inline'; Codehighlighter1_167_192_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"> </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_167_192_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_167_192_Open_Text"><span style="color: #000000">{ <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /> </span><span style="color: #0000ff">super</span><span style="color: #000000">(shardIds); <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" /> }</span></span><span style="color: #000000"> <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /> <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /> </span><span style="color: #0000ff">public</span><span style="color: #000000"> List</span><span style="color: #000000">&lt;</span><span style="color: #000000">ShardId</span><span style="color: #000000">&gt;</span><span style="color: #000000"> selectShardIdsFromShardResolutionStrategyData( ShardResolutionStrategyData srsd)<br /><img id="Codehighlighter1_304_530_Open_Image" onclick="this.style.display='none'; Codehighlighter1_304_530_Open_Text.style.display='none'; Codehighlighter1_304_530_Closed_Image.style.display='inline'; Codehighlighter1_304_530_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_304_530_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_304_530_Closed_Text.style.display='none'; Codehighlighter1_304_530_Open_Image.style.display='inline'; Codehighlighter1_304_530_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"> </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_304_530_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_304_530_Open_Text"><span style="color: #000000">{ <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /> </span><span style="color: #0000ff">if</span><span style="color: #000000">(srsd.getEntityName().equals(WeatherReport.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getName())) <br /><img id="Codehighlighter1_376_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_376_455_Open_Text.style.display='none'; Codehighlighter1_376_455_Closed_Image.style.display='inline'; Codehighlighter1_376_455_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_376_455_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_376_455_Closed_Text.style.display='none'; Codehighlighter1_376_455_Open_Image.style.display='inline'; Codehighlighter1_376_455_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif"> </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_376_455_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_376_455_Open_Text"><span style="color: #000000">{ <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /> </span><span style="color: #0000ff">return</span><span style="color: #000000"> Continent.getContinentByReportId(srsd.getId()).getShardId(); <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" /> }</span></span><span style="color: #000000"> <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif"  alt="" /> </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">super</span><span style="color: #000000">.selectShardIdsFromShardResolutionStrategyData(srsd); <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" /> }</span></span><span style="color: #000000"> <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div><img src ="http://www.blogjava.net/paulwong/aggbug/367869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-01-04 22:40 <a href="http://www.blogjava.net/paulwong/archive/2012/01/04/367869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Generic D.A.O. Framework</title><link>http://www.blogjava.net/paulwong/archive/2011/11/26/364870.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 25 Nov 2011 20:23:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2011/11/26/364870.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/364870.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2011/11/26/364870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/364870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/364870.html</trackback:ping><description><![CDATA[<h2><a name="The_motivation_behind_the_framework"><u></u></a>The motivation behind the framework<a class="section_anchor" href="http://code.google.com/p/hibernate-generic-dao/#The_motivation_behind_the_framework"></a></h2>
<p>We had worked on a project where we hand-coded all of our DAOs. This produced four irksome difficulties: (1) Method names and implementations were not altogether consistent. (2) It was a pain to make additional columns sortable or filterable, and as a result, a lot of pages lacked good sorting and filtering. (3) Making additional DAOs was tedious and took a fair amount of time. (4) Writing tests for DAOs is tricky and tedious, so no one really did. </p>
<p>This framework aims to ease our troubles. </p>
<h2><a name="Why_might_you_consider_looking_into_this_framework?"><u></u></a>Why might you consider looking into this framework?<a class="section_anchor" href="http://code.google.com/p/hibernate-generic-dao/#Why_might_you_consider_looking_into_this_framework?"></a></h2>
<ul><li><strong><em>Generic DAO:</em></strong> With the sweetness of Java generics, the concept of generic DAOs is not new, and it&#8217;s not difficult. However, we&#8217;ve put a lot of work into making these easy to use and robust. So if you like the way we&#8217;ve done it, then this framework provides <strong>ready-made code</strong> for you. On the other hand if you&#8217;d rather make your own, then simply feel free to <strong>look at our source code for ideas</strong> and help on a few potentially tricky issues. </li></ul>
<ul><li><strong><em>Search:</em></strong> Search is the most original and sophisticated part of this framework, and it <strong>can be used with or without the generic DAO portion</strong> of the framework. The search capability is designed around the use-case of a list page with <strong>sorting, filtering, column selection and paging</strong>. However, its use is certainly not limited to that. The value that the search adds is <strong>simpler, more robust querying with less coding and less testing</strong>. It is similar to Hibernate Criteria, but it is simpler to use and can easily move across layers of an application including view and even remote layers. Plus is works with both Hibernate and JPA<sup>*</sup>. </li></ul>
<ul><li><strong><em>Remote DAO (for R.I.A.s?):</em></strong> If you you&#8217;re like us, you don&#8217;t want to write and configure an individual DAO style remote service for each entity in a R.I.A. or other client-heavy application. This framework may have the solution. We provide utilities and sample code to <strong>adapt our single general DAO to any remoting technology interface</strong>. Just configure this single remote access point and the client can do any basic CRUD or search operation on any entity. Again, if you don&#8217;t like our way of doing things, maybe you can at least get some ideas from our source code. </li></ul>
<ul><li><strong><em>Remote Search (for R.I.A.s?):</em></strong> As mentioned above, the framework can provide a single point for client-server CRUD and search operations. The framework&#8217;s search is meant to be able to <strong>cross the client-server boundary</strong>. So lists and searches in the <strong>client application can take advantage of the same easy-to-use features and consistency that the search functionality provides</strong> in the server tier or single tier application. This consistency allowed us to create a reusable collection type in Adobe Flex 3 that is associated with a single search object and automatically updates itself from the server according to the search parameters.<sup>**</sup> </li></ul>
<p><sup>*</sup>A fairly simple adapter is required for each JPA provider. Right now we only have an adapter for Hibernate Entity Manager. If anyone would like to contribute an adapter for any other JPA provider (OpenJPA, TopLink, etc.), that would be great. </p>
<p><sup>**</sup>If time permits, we would like to eventually post our corresponding Adobe Flex 3 framework and utilities. </p>
<h2><a name="More_Information"><u></u></a>More Information<a class="section_anchor" href="http://code.google.com/p/hibernate-generic-dao/#More_Information"></a></h2>
<p>Wiki Documentation: <a href="http://code.google.com/p/hibernate-generic-dao/wiki/UserGuide"><font color="#0000cc">UserGuide</font></a> </p>
<p>Javadoc: <a href="http://hibernate-generic-dao.googlecode.com/svn/trunk/docs/api/index.html" rel="nofollow"><font color="#0000cc">http://hibernate-generic-dao.googlecode.com/svn/trunk/docs/api/index.html</font></a> </p>
<p>Blog: </a><a href="http://hibernategenericdao.wordpress.com/" rel="nofollow"><font color="#0000cc">http://hibernategenericdao.wordpress.com/</font></a> </p>
<h2><a name="Questions_and_Comments"><u></u></a>Questions and Comments<a class="section_anchor" href="http://code.google.com/p/hibernate-generic-dao/#Questions_and_Comments"></a></h2>
<p>Please post at </a><a href="http://groups.google.com/group/java-generic-dao" rel="nofollow"><font color="#0000cc">http://groups.google.com/group/java-generic-dao</font></a>. </p>
<h2><a name="Code_Examples"><u></u></a>Code Examples<a class="section_anchor" href="http://code.google.com/p/hibernate-generic-dao/#Code_Examples"></a></h2>
<h3><a name="Creating_DAOs_for_individual_model_classes:"><u></u></a>Creating DAOs for individual model classes:</a><a class="section_anchor" href="http://code.google.com/p/hibernate-generic-dao/#Creating_DAOs_for_individual_model_classes:"></a></h3>
<p>Simply extend the GenericDAO class with the specific type. </p><pre class="prettyprint"><span class="pun"><font color="#666600">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img id="Codehighlighter1_62_66_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_66_Open_Text.style.display='none'; Codehighlighter1_62_66_Closed_Image.style.display='inline'; Codehighlighter1_62_66_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_62_66_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_62_66_Closed_Text.style.display='none'; Codehighlighter1_62_66_Open_Image.style.display='inline'; Codehighlighter1_62_66_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ProjectDAO&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;GenericDAO</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project,&nbsp;Long</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_62_66_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_62_66_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img id="Codehighlighter1_158_162_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_162_Open_Text.style.display='none'; Codehighlighter1_158_162_Closed_Image.style.display='inline'; Codehighlighter1_158_162_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_158_162_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_158_162_Closed_Text.style.display='none'; Codehighlighter1_158_162_Open_Image.style.display='inline'; Codehighlighter1_158_162_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ProjectDAOImpl&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;GenericDAOImpl</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project,&nbsp;Long</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ProjectDAO&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_158_162_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_158_162_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
</font></span></pre>
<h3>The following methods (and several more) are now available on ProjectDAO<br /></h3>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">Project project </span><span style="color: #000000">=</span><span style="color: #000000"> projectDAO.find(projectId);<br />&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project</span><span style="color: #000000">&gt;</span><span style="color: #000000"> list </span><span style="color: #000000">=</span><span style="color: #000000"> projectDAO.findAll(); <br />projectDAO.save(project); <br />projectDAO.remove(project);<br />projectDAO.removeById(project.getId()); <br /><br />Search search </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Search(); <br />search.addFilterEqual(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">hibernate-generic-dao</span><span style="color: #000000">"</span><span style="color: #000000">); <br />List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project</span><span style="color: #000000">&gt;</span><span style="color: #000000"> list </span><span style="color: #000000">=</span><span style="color: #000000"> projectDAO.search(search); <br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> count </span><span style="color: #000000">=</span><span style="color: #000000"> projectDAO.count(search); <br />SearchResult</span><span style="color: #000000">&lt;</span><span style="color: #000000">Project</span><span style="color: #000000">&gt;</span><span style="color: #000000"> result </span><span style="color: #000000">=</span><span style="color: #000000"> projectDAO.searchAndCount(search); <br />list </span><span style="color: #000000">=</span><span style="color: #000000"> result.getResult(); <br />count </span><span style="color: #000000">=</span><span style="color: #000000"> result.getTotalCount(); <br />search.clear(); <br />search.addField(</span><span style="color: #000000">"</span><span style="color: #000000">rating</span><span style="color: #000000">"</span><span style="color: #000000">, Field.OP_AVG); <br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> avgProjectRating </span><span style="color: #000000">=</span><span style="color: #000000"> (Integer) prjoectDAO.searchUnique(search);</span></div><br /><br />
<h3>A GeneralDAO is also provided with DAO methods for any entity:</h3><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img id="Codehighlighter1_28_978_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_978_Open_Text.style.display='none'; Codehighlighter1_28_978_Closed_Image.style.display='inline'; Codehighlighter1_28_978_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_28_978_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_28_978_Closed_Text.style.display='none'; Codehighlighter1_28_978_Open_Image.style.display='inline'; Codehighlighter1_28_978_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> GeneralDAO </span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_28_978_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_28_978_Open_Text"><span style="color: #000000">{ <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> T find(Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> type, Serializable id); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> T[] find(Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> type, Serializable ids); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> T getReference(Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> type, Serializable id); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> T[] getReferences(Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> type, Serializable ids); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> save(Object entity); </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000">[] save(Object entities); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> remove(Object entity); </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> remove(Object entities); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> removeById(Class</span><span style="color: #000000">&lt;?&gt;</span><span style="color: #000000"> type, Serializable id); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> removeByIds(Class</span><span style="color: #000000">&lt;?&gt;</span><span style="color: #000000"> type, Serializable ids); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> List</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> findAll(Class</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000"> type); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> List search(ISearch search); </span><span style="color: #0000ff">public</span><span style="color: #000000"> Object searchUnique(ISearch search); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> count(ISearch search); </span><span style="color: #0000ff">public</span><span style="color: #000000"> SearchResult searchAndCount(ISearch search); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isAttached(Object entity); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> refresh(Object entities); </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> flush(); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> Filter getFilterFromExample(Object example); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> Filter getFilterFromExample(Object example, ExampleOptions options); }</span></span></div>
<h3>Search DTO usage examples<a class="section_anchor" href="http://code.google.com/p/hibernate-generic-dao/#Search_DTO_usage_examples"></a></h3><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: #000000">Search search </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Search(Project.</span><span style="color: #0000ff">class</span><span style="color: #000000">); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">filtering </span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #000000">search.addFilterEqual(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">hibernate-generic-dao</span><span style="color: #000000">"</span><span style="color: #000000">); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />search.addFilterLessThan(</span><span style="color: #000000">"</span><span style="color: #000000">completionDate</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Date()); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />search.addFilterOr( <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /> Filter.equal(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">Jack</span><span style="color: #000000">"</span><span style="color: #000000">), <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /> Filter.and( <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /> Filter.equal(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">Jill</span><span style="color: #000000">"</span><span style="color: #000000">), <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /> Filter.like(</span><span style="color: #000000">"</span><span style="color: #000000">location</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">%Chicago%</span><span style="color: #000000">"</span><span style="color: #000000">), <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /> Filter.greaterThan(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">5</span><span style="color: #000000">) ) <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />search.addFilterIn(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">Jack</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">Jill</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">Bob</span><span style="color: #000000">"</span><span style="color: #000000">); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />search.addFilterNot(Filter.in(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Jack</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">Jill</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">Bob</span><span style="color: #000000">"</span><span style="color: #000000">)); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">sorting </span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #000000">search.addSort(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />search.addSort(</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">true</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">descending <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">projection </span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #000000">search.addField(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />search.addField(</span><span style="color: #000000">"</span><span style="color: #000000">location</span><span style="color: #000000">"</span><span style="color: #000000">); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">or with column operators </span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #000000">search.addField(</span><span style="color: #000000">"</span><span style="color: #000000">rating</span><span style="color: #000000">"</span><span style="color: #000000">, Field.OP_AVG); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />search.addField(</span><span style="color: #000000">"</span><span style="color: #000000">developerCount</span><span style="color: #000000">"</span><span style="color: #000000">, Field.OP_MAX); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">paging </span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #000000">search.setMaxResults(</span><span style="color: #000000">15</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">a.k.a. results per page </span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #000000">search.setPage(</span><span style="color: #000000">3</span><span style="color: #000000">); <br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">controlling eager fetching of relationships </span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #000000">serach.addFetch(</span><span style="color: #000000">"</span><span style="color: #000000">owner</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>&nbsp; 
<h3>Nested properties are also fully supported...<br /></h3><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">search.addFilterEqua(</span><span style="color: #000000">"</span><span style="color: #000000">status.name</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">active</span><span style="color: #000000">"</span><span style="color: #000000">); <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />search.addFilterGreaterThan(</span><span style="color: #000000">"</span><span style="color: #000000">workgroup.manager.salary</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">75000.00</span><span style="color: #000000">); <br /><img align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif"  alt="" />search.addSort(</span><span style="color: #000000">"</span><span style="color: #000000">status.name</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div> <img src ="http://www.blogjava.net/paulwong/aggbug/364870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2011-11-26 04:23 <a href="http://www.blogjava.net/paulwong/archive/2011/11/26/364870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA使用memcached的2级缓存的配置</title><link>http://www.blogjava.net/paulwong/archive/2011/02/16/344420.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 16 Feb 2011 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2011/02/16/344420.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/344420.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2011/02/16/344420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/344420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/344420.html</trackback:ping><description><![CDATA[<br />
1.加入hibernate－memcached.jar及相关jar包<br />
hibernate-memcached需要支持的类库如下:<br />
hibernate-memcached-<version>.jar , <br />
memcached-2.1.jar <br />
spy-2.4.jar <br />
commons-codec 1.3 .<br />
slf4j-1.5.0.jar 如果你的项目使用的是Log4j,可以用 slf4j-log4j12-1.5.0.jar <br />
<br />
2.在applicationContext.xml中配置 <br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="entityManagerFactory"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jpaVendorAdapter"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="showSql"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${jpa.showSql}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="generateDdl"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="${jpa.generateDdl}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="database"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">util:constant<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">static-field</span><span style="color: #0000ff">="org.springframework.orm.jpa.vendor.Database.ORACLE"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jpaProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.max_fetch_depth"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.cache.use_second_level_cache"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.cache.use_structured_entries"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.cache.use_query_cache"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.cache.provider_class"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.googlecode.hibernate.memcached.MemcachedCacheProvider<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.memcached.servers"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.1.19.132:33001&nbsp;10.1.19.132:33002&nbsp;10.1.19.132:33003<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
3.在实体类上配置缓存策略<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">@org.hibernate.annotations.Cache(usage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">CacheConcurrencyStrategy.READ_WRITE)&nbsp;&nbsp;</span></div>
<br />
下面这几种情况就不适合加载到二级缓存中: <br />
1.经常被修改的数据 <br />
2.绝对不允许出现并发访问的数据 <br />
3.与其他应用共享的数据 <br />
下面这己种情况合适加载到二级缓存中: <br />
1.数据更新频率低 <br />
2.允许偶尔出现并发问题的非重要数据&nbsp;<br />
3.不会被并发访问的数据 <br />
4.常量数据 <br />
5.不会被第三方修改的数据 
<img src ="http://www.blogjava.net/paulwong/aggbug/344420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2011-02-16 11:10 <a href="http://www.blogjava.net/paulwong/archive/2011/02/16/344420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 的session.createCriteria用法</title><link>http://www.blogjava.net/paulwong/archive/2009/07/03/285345.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 03 Jul 2009 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2009/07/03/285345.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/285345.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2009/07/03/285345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/285345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/285345.html</trackback:ping><description><![CDATA[某一对象的配置文件：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">many-to-one&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="partyTypeBean"</span><span style="color: #ff0000">&nbsp;column</span><span style="color: #0000ff">="NATT_ID"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="com.paul..PartyTypeBean"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="none"</span><span style="color: #ff0000">&nbsp;outer-join</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;not-found</span><span style="color: #0000ff">="ignore"</span><span style="color: #ff0000">&nbsp;lazy</span><span style="color: #0000ff">="false"</span><span style="color: #0000ff">/&gt;</span></div>
<br />
<br />
如果查询Party，则其关联对象PartyTypeBean是以outer-join的方式取，若要覆盖这种方式，可采用建别名的方式，如下：<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Criteria&nbsp;criteria&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createCriteria(PartyBean.</span><span style="color: #0000ff">class</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000">"</span><span style="color: #000000">partyTypeBean</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">partyTypeBean</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;Criteria.INNER_JOIN)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000">"</span><span style="color: #000000">cafBean</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">cafBean</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;Criteria.LEFT_JOIN)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000">"</span><span style="color: #000000">countryBean</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">countryBean</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;Criteria.INNER_JOIN)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/paulwong/aggbug/285345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2009-07-03 14:24 <a href="http://www.blogjava.net/paulwong/archive/2009/07/03/285345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重写toString(),hashCode()和equals()的简便方法</title><link>http://www.blogjava.net/paulwong/archive/2009/05/08/269598.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 08 May 2009 05:50:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2009/05/08/269598.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/269598.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2009/05/08/269598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/269598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/269598.html</trackback:ping><description><![CDATA[使用APACHE的LANG包中的相关类，可简写很多。<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_26_146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_146_Open_Text.style.display='none'; Codehighlighter1_26_146_Closed_Image.style.display='inline'; Codehighlighter1_26_146_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_26_146_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_26_146_Closed_Text.style.display='none'; Codehighlighter1_26_146_Open_Image.style.display='inline'; Codehighlighter1_26_146_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;toString()&nbsp;</span><span id="Codehighlighter1_26_146_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_26_146_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ToStringBuilder.reflectionToString(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ToStringStyle.MULTI_LINE_STYLE);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img id="Codehighlighter1_190_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_190_258_Open_Text.style.display='none'; Codehighlighter1_190_258_Closed_Image.style.display='inline'; Codehighlighter1_190_258_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_190_258_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_190_258_Closed_Text.style.display='none'; Codehighlighter1_190_258_Open_Image.style.display='inline'; Codehighlighter1_190_258_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;equals(Object&nbsp;o)&nbsp;</span><span id="Codehighlighter1_190_258_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_190_258_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;EqualsBuilder.reflectionEquals(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;o);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img id="Codehighlighter1_292_459_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_459_Open_Text.style.display='none'; Codehighlighter1_292_459_Closed_Image.style.display='inline'; Codehighlighter1_292_459_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_292_459_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_292_459_Closed_Text.style.display='none'; Codehighlighter1_292_459_Open_Image.style.display='inline'; Codehighlighter1_292_459_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hashCode()&nbsp;</span><span id="Codehighlighter1_292_459_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_292_459_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashCodeBuilder(</span><span style="color: #000000">17</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">37</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(id)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(name)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(state)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toHashCode();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;</span></div>
<br />
<br />
<br />
如果PO中有SET的集合对象，并且配置了HIBERNATE中的lazy="true"，则算HASHCODE不能用反射的方法，只能一个属性一个属性的累加计算HASHCODE，集合SET不算HASHCODE，否则会抛LazyInitializationException。继承的子类可以用这种方法加以覆盖：<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_22_173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_173_Open_Text.style.display='none'; Codehighlighter1_22_173_Closed_Image.style.display='inline'; Codehighlighter1_22_173_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_22_173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_173_Closed_Text.style.display='none'; Codehighlighter1_22_173_Open_Image.style.display='inline'; Codehighlighter1_22_173_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;hashCode()&nbsp;</span><span id="Codehighlighter1_22_173_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_22_173_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashCodeBuilder(</span><span style="color: #000000">17</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">37</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.appendSuper(</span><span style="color: #0000ff">super</span><span style="color: #000000">.hashCode())<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(code)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toHashCode();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/paulwong/aggbug/269598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2009-05-08 13:50 <a href="http://www.blogjava.net/paulwong/archive/2009/05/08/269598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HIBERNATE中的对象设计</title><link>http://www.blogjava.net/paulwong/archive/2009/05/01/268500.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 01 May 2009 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2009/05/01/268500.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/268500.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2009/05/01/268500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/268500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/268500.html</trackback:ping><description><![CDATA[zRoom与User存在一对多的关系，如果要在取得Room的同时取得User，则在Room中加入Set，List或Map类型的集合成员，Set中的元素不可以重复，List中的元素可以重复，Map是鍵值对类型的集合。<br />
<br />
在HIBERNATE的配置文件中象这样配置：<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">set&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="users"</span><span style="color: #ff0000">&nbsp;table</span><span style="color: #0000ff">="user"</span><span style="color: #ff0000">&nbsp;cascade</span><span style="color: #0000ff">="all" &nbsp;<span style="color: red">inverse</span>="true"&nbsp; <span style="color: red">lazy</span>="extra"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="room_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">one-to-many&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="paul.com.User"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">set</span><span style="color: #0000ff">&gt;</span></div>
<br />
<ol>
    <li>指定users私有成员的类型为SET：<span style="color: #800000">set&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="users"</span>
    <li>指定集合中的对象类型为User:<span style="color: #0000ff">&lt;</span><span style="color: #800000">one-to-many&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="</span><span style="color: #0000ff">paul.com</span><span style="color: #0000ff">.User"</span><span style="color: #0000ff">/&gt;</span>
    <li>指定User对应的表：<span style="color: #ff0000">table</span><span style="color: #0000ff">="user"</span>
    <li>指定外键：<span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="room_id"</span><span style="color: #0000ff">/&gt;</span>
    <li>指定如果同时新增、修改、删除关联的Room和User对象时，是否需要HIBERNATE执行两次操作：<span style="color: #ff0000">cascade</span><span style="color: #0000ff">="all"</span>
    <li>指定&nbsp;<span style="color: red">lazy</span><span style="color: #0000ff">="extra"<span style="color: #000000">时</span></span>，则集合中的元素不会被一起取出，而且要读SIZE时，只会发送一条COUNT的SQL语句至后台
    <li>指定&nbsp;<span style="color: red">inverse</span><span style="color: #0000ff">="true"</span>时，当保存一的对象时，对应的多的对象不会同时被保存。</li>
</ol>
<br />
如果要在取得User对象的同时取得Room对象，则在User中加入私有成员Room，在HIBERNATE的配置文件中如下配置：<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">many-to-one&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="room"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column</span><span style="color: #0000ff">="room_id"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class</span><span style="color: #0000ff">="paul.com.Room"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cascade</span><span style="color: #0000ff">="all"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outer-join</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp; <br />
</span></div>
<br />
<ol>
    <li>指定名称为room成员的类型：<span style="color: #800000">many-to-one&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="room"</span>
    <li>指定room对应的类名：<span style="color: #ff0000">class</span><span style="color: #0000ff">="paul.com.Room"</span>
    <li>指定外键：<span style="color: #ff0000">column</span><span style="color: #0000ff">="room_id"</span>
    <li>指定如果同时新增、修改、删除关联的Room和User对象时，是否需要HIBERNATE执行两次操作：<span style="color: #ff0000">cascade</span><span style="color: #0000ff">="all"</span>
    <li>指定关联两个表时的查询是否使用left-outer关键字：<span style="color: #ff0000">outer-join</span><span style="color: #0000ff">="true"</span> </li>
</ol>
User和Server是多对多的关系，如要在取得User对象的同时取得Server，可以User中加入Set私有成员，在HIBERNATE中如下配置：<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">set&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="servers"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table</span><span style="color: #0000ff">="user_server"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cascade</span><span style="color: #0000ff">="save-update"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="user_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">many-to-many&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="paul.com.Server"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column</span><span style="color: #0000ff">="server_id"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">set</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> <br />
</span></div>
<br />
<ol>
    <li>指定名称为servers的私有成员的类型为SET：<span style="color: #800000">set&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="servers"</span><span style="color: #ff0000"> <br />
    </span>
    <li>指定中间表为：<span style="color: #ff0000">table</span><span style="color: #0000ff">="user_server"</span>
    <li>指定User表与中间表关联的外键：<span style="color: #800000">key&nbsp;</span><span style="color: #ff0000">column</span><span style="color: #0000ff">="user_id"</span>
    <li>指定集合中的对象类型为：<span style="color: #800000">many-to-many&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="paul.com.Server"</span>
    <li>指定中间表与Server关联的外键：<span style="color: #ff0000">column</span><span style="color: #0000ff">="server_id"</span>
    <li>指定如果同时新增、修改、删除关联的Room和User对象时，是否需要HIBERNATE执行两次操作：<span style="color: #ff0000">cascade</span><span style="color: #0000ff">="save-update"</span> </li>
</ol>
<br />
如此配置后，将大量减少SQL语句的撰写。<br />
<span style="color: #0000ff"><br />
</span>
<img src ="http://www.blogjava.net/paulwong/aggbug/268500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2009-05-01 11:57 <a href="http://www.blogjava.net/paulwong/archive/2009/05/01/268500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Hibernate实现领域对象的自定义字段</title><link>http://www.blogjava.net/paulwong/archive/2008/01/23/177227.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 23 Jan 2008 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2008/01/23/177227.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/177227.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2008/01/23/177227.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/177227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/177227.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 导言 在开发企业级业务应用（企业规模）时，客户往往要求在不修改系统源代码的情况下对应用对象模型的扩展性提供支持。利用可扩展域模型可以实现新功能的开发，而不需要额外的精力和成本    应用的使用周期将被延长；&nbsp;    外部因素改变时，系统工作流也可以随之被修改；    已经被部署的应用可以被&#8220;设定&#8221;，使其符合企业的特定情况。 完成以上功能...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2008/01/23/177227.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/177227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2008-01-23 11:57 <a href="http://www.blogjava.net/paulwong/archive/2008/01/23/177227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>