??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲综合久久,亚洲国产成人精品无码一区二区 ,国产亚洲精品xxxhttp://www.tkk7.com/zhaochengming/category/24904.html 知止而后有定Q定而后能静Q静而后能安Q安而后能虑Q虑而后能得。物有本末,事有l始。知所先后Q则q道矣?/description>zh-cnWed, 27 Jul 2011 14:06:50 GMTWed, 27 Jul 2011 14:06:50 GMT60spring和Hibernate整合时候的asm包冲H?转自(http://apps.hi.baidu.com/share/detail/33127760)http://www.tkk7.com/zhaochengming/archive/2011/07/25/355003.htmlhelloworld2008helloworld2008Mon, 25 Jul 2011 09:14:00 GMThttp://www.tkk7.com/zhaochengming/archive/2011/07/25/355003.htmlhttp://www.tkk7.com/zhaochengming/comments/355003.htmlhttp://www.tkk7.com/zhaochengming/archive/2011/07/25/355003.html#Feedback0http://www.tkk7.com/zhaochengming/comments/commentRss/355003.htmlhttp://www.tkk7.com/zhaochengming/services/trackbacks/355003.html

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)VCaused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)

|上的说法真是良莠不?最l找?span style="color: #009900">能解决问题的Ҏ(gu)
(折腾我一下午,快疯?

原因Q?/span>

在用Spring的AOP~程Ӟ会用到这几个libQ?br />asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
Hibernate使用如下libQ?/strong>
asm.jar
asm-attrs.jar


其中asm-2.2.2.jar与asm.jar存在cM的冲H!Q!
使用其中之一或两者都使用Q可能会出现如下错误Q?br />java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit

 

解决Ҏ(gu)Q?/font>

1.Lc\径上的关于Hibernate?个lib
asm.jar
asm-attrs.jar
cglib-2.1.2.jar
2.加入Spring中的以下4个lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar

自己的一个小试Q?(q行环境Qapache-tomcat-5.5.15 + .MyEclipse_5.5GA_E3.2.2 )

整合ssh目? ?Tomcat 部v的环境中 D:\tomcat\webapps\my\WEB-INF\lib 发生了点异常Q同时有
asm.jar、asm-attrs.jar、asm-2.2.3.jar ?asm-commons-2.2.3.jar
asm-util-2.2.3.jar?cglib-nodep-2.1_3.jar
在启动tomcat中不会出现异怿息?我想asm-2.2.3jar可能在一定程度上作了改进?

当在D:\tomcat\webapps\my\WEB-INF\lib 下加?/font> cglib-2.1.3.jar
会报上面的java.lang.NoSuchMethodError:
org.objectweb.asm.ClassVisitor.visit错误信息?/font> 说明cglib-2.1.3.jar与其它包发生了冲H?/font>?/strong>
删除cglib-2.1.3.jar问题解决!


helloworld2008 2011-07-25 17:14 发表评论
]]>
hibernate 查询 http://www.tkk7.com/zhaochengming/archive/2009/10/18/298756.htmlhelloworld2008helloworld2008Sun, 18 Oct 2009 08:30:00 GMThttp://www.tkk7.com/zhaochengming/archive/2009/10/18/298756.htmlhttp://www.tkk7.com/zhaochengming/comments/298756.htmlhttp://www.tkk7.com/zhaochengming/archive/2009/10/18/298756.html#Feedback0http://www.tkk7.com/zhaochengming/comments/commentRss/298756.htmlhttp://www.tkk7.com/zhaochengming/services/trackbacks/298756.html转自http://blog.csdn.net/ctgyp/archive/2007/12/18/1946626.aspx
W?14 ?扚w处理QBatch processingQ?br /> 使用Hibernate?100 000 条记录插入到数据库的一个很自然的做法可能是q样?

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
}
tx.commit();
session.close();q段E序大概q行?50 000 条记录左右会p|q抛?内存溢出异常QOutOfMemoryExceptionQ??q是因ؓ Hibernate 把所有新插入?客户QCustomerQ实例在 sessionU别的缓存区q行了缓存的~故?

我们会在本章告诉你如何避免此c问题。首先,如果你要执行扚w处理q且惌辑ֈ一个理想的性能Q?那么使用JDBC的批量(batchingQ功能是臛_重要。将JDBC的批量抓取数量(batch sizeQ参数设|到一个合适?Q比如,10-50之间Q:

hibernate.jdbc.batch_size 20你也可能惛_执行扚w处理时关闭二U缓存:

hibernate.cache.use_second_level_cache false14.1. 扚w插入QBatch insertsQ?br /> 如果要将很多对象持久化,你必通过l常的调?flush() 以及E后调用 clear() 来控制第一U缓存的大小?

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC扚w讄相同
//flush a batch of inserts and release memory:
//本Ҏ(gu)入的对象立即写入数据库ƈ释放内存
session.flush();
session.clear();
}
}
tx.commit();
session.close();14.2. 扚w更新QBatch updatesQ?br /> 此方法同样适用于检索和更新数据。此外,在进行会q回很多行数据的查询Ӟ 你需要?scroll() Ҏ(gu)以便充分利用服务器端游标所带来的好处?

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
if ( ++count % 20 == 0 ) {
//flush a batch of updates and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();14.3. 大批量更?删除QBulk update/deleteQ?br /> 像已经讨论的那P自动和透明?对象/关系 映射Qobject/relational mappingQ关注于理对象的状态?q就意味着对象的状态存在于内存Q因此直接更新或者删?(使用 SQL 语句 UPDATE ?DELETE) 数据库中的数据将不会影响内存中的对象状态和对象数据?不过QHibernate提供通过Hibernate查询语言Q第 15 ?HQL: Hibernate查询语言Q来执行大批 量SQL风格的(UPDATEQ和QDELETEQ?语句的方法?

UPDATE ?DELETE语句的语法ؓQ?( UPDATE | DELETE ) FROM? ClassName (WHERE WHERE_CONDITIONS)??有几点说明:

在FROM子句Qfrom-clauseQ中QFROM关键字是可选的

在FROM子句Qfrom-clauseQ中只能有一个类名,q且它不能有别名

不能在大扚wHQL语句中用连接(昑ּ或者隐式的都不行)。不q在WHERE子句中可以用子查询?

整个WHERE子句是可选的?

举个例子Q用Query.executeUpdate()Ҏ(gu)执行一个HQL UPDATE语句Q?

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();执行一个HQL DELETEQ同样?Query.executeUpdate() Ҏ(gu) Q此Ҏ(gu)是ؓ 那些熟?zhn)JDBC PreparedStatement.executeUpdate() 的h们而设定的Q?

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.createQuery( hqlDelete )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();由Query.executeUpdate()Ҏ(gu)q回的整型D明了受此操作影响的记录数量?注意q个数值可能与数据库中被(最后一条SQL语句Q媄响了?#8220;?#8221;数有养I也可能没有。一个大扚wHQL操作可能D多条实际的SQL语句被执行, 举个例子Q对joined-subclass映射方式的类q行的此cL作。这个返回g表了实际被语句媄响了的记录数量。在那个joined-subclass的例子中Q?对一个子cȝ删除实际上可能不仅仅会删除子cL到的表而且会媄?#8220;?#8221;表,q有可能影响与之有承关pȝjoined-subclass映射方式的子cȝ表?

注意Q上q大扚wHQL操作的少数限制会在新版本中得到改q;q一步详l信息请参考JIRA里的路线?roadmap)?

W?15 ?HQL: Hibernate查询语言
Hibernate配备了一U非常强大的查询语言Q这U语a看上d像SQL。但是不要被语法l构 上的怼所qhQHQL是非常有意识的被设计为完全面向对象的查询Q它可以理解如ѝ多?和关联之cȝ概念?

15.1. 大小写敏感性问?br /> 除了JavacM属性的名称外,查询语句对大写q不敏感?所?SeLeCT ?sELEct 以及 SELECT 是相同的Q但?org.hibernate.eg.FOO q不{h(hun)?org.hibernate.eg.Foo q且 foo.barSet 也不{h(hun)?foo.BARSET?

本手册中的HQL关键字将使用写字母. 很多用户发现使用完全大写的关键字会查询语句 的可L更? 但我们发玎ͼ当把查询语句嵌入到Java语句中的时候用大写关键字比较隄?

15.2. from子句
Hibernate中最单的查询语句的Ş式如下:

from eg.Cat该子句简单的q回eg.Catcȝ所有实例?通常我们不需要用类的全限定? 因ؓ auto-importQ自动引入) 是缺省的情况?所以我们几乎只使用如下的简单写法:

from Cat大多数情况下, 你需要指定一个别? 原因是你可能需?在查询语句的其它部分引用到Cat

from Cat as catq个语句把别名cat指定l类Cat 的实? q样我们可以在随后的查询中使用此别名了?关键字as 是可选的Q我们也可以q样?

from Cat cat子句中可以同时出现多个类, 其查询结果是产生一个笛卡儿U或产生跨表的连接?

from Formula, Parameterfrom Formula as form, Parameter as param查询语句中别名的开头部分小写被认ؓ是实践中的好习惯Q?q样做与Java变量的命名标准保持了一?(比如QdomesticCat)?

15.3. 兌(Association)与连?Join)
我们也可以ؓ相关联的实体甚至是对一个集合中的全部元素指定一个别? q时要用关键字join?

from Cat as cat
inner join cat.mate as mate
left outer join cat.kittens as kittenfrom Cat as cat left join cat.mate.kittens as kittensfrom Formula form full join form.parameter param受支持的q接cd是从ANSI SQL中借鉴来的?

inner joinQ内q接Q?

left outer joinQ左外连接)

right outer joinQ右外连接)

full join (全连接,q不常用)

语句inner join, left outer join 以及 right outer join 可以写?

from Cat as cat
join cat.mate as mate
left join cat.kittens as kittenq有Q一?fetch"q接允许仅仅使用一个选择语句将相关联的对象或一l值的集合随着他们的父对象的初始化而被初始化,q种Ҏ(gu)在用到集合的情况下其有用Q对于关联和集合来说Q它有效的代替了映射文g中的外联?与gq声明(lazy declarationsQ? 查看 W?20.1 ?“ 抓取{略(Fetching strategies) ” 以获得等多的信息?

from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens一个fetchq接通常不需要被指定别名, 因ؓ相关联的对象不应当被用在 where 子句 (或其它Q何子?中。同Ӟ相关联的对象 q不在查询的l果中直接返回,但可以通过他们的父对象来访问到他们?

注意fetch构造变量在使用了scroll() ?iterate()函数 的查询中是不能用的。最后注意,使用full join fetch ?right join fetch是没有意义的?

如果你用属性别的延迟获取Qlazy fetchingQ(q是通过重新~写字节码实现的Q,可以使用 fetch all properties 来强制Hibernate立即取得那些原本需要gq加载的属性(在第一个查询中Q?

from Document fetch all properties order by namefrom Document doc fetch all properties where lower(doc.name) like '%cats%'15.4. select子句
select 子句选择哪些对象与属性返 回到查询l果集中. 考虑如下情况:

select mate
from Cat as cat
inner join cat.mate as mate该语句将选择mates of other Cats。(其他猫的配偶Q?实际? 你可以更z的用以下的查询语句表达相同的含?

select cat.mate from Cat cat查询语句可以q回gؓMcd的属性,包括q回cd为某U组?Component)的属?

select cat.name from DomesticCat cat
where cat.name like 'fri%'select cust.name.firstName from Customer as cust查询语句可以q回多个对象和(或)属性,存放?Object[]队列?

select mother, offspr, mate.name
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr或存攑֜一个List对象?

select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr也可能直接返回一个实际的cd安全的Java对象,

select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr假设cFamily有一个合适的构造函?

你可以用关键字asl?#8220;被选择了的表达?#8221;指派别名:

select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
from Cat catq种做法在与子句select new map一起用时最有用:

select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
from Cat cat该查询返回了一个Map的对象,内容是别名与被选择的值组成的?值映?

15.5. 聚集函数
HQL查询甚至可以q回作用于属性之上的聚集函数的计结?

select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
from Cat cat受支持的聚集函数如下Q?

avg(...), sum(...), min(...), max(...)

count(*)

count(...), count(distinct ...), count(all...)

你可以在选择子句中用数学操作符、连接以及经q验证的SQL函数Q?

select cat.weight + sum(kitten.weight)
from Cat cat
join cat.kittens kitten
group by cat.id, cat.weightselect firstName||' '||initial||' '||upper(lastName) from Person关键字distinct与all 也可以用,它们h与SQL相同的语?

select distinct cat.name from Cat cat
select count(distinct cat.name), count(cat) from Cat cat15.6. 多态查?br /> 一个如下的查询语句:

from Cat as cat不仅q回Catcȝ实例, 也同时返回子c?DomesticCat的实? Hibernate 可以在from子句中指定Q?Java cL接口. 查询会返回承了该类的所有持久化子类 的实例或q回声明了该接口的所有持久化cȝ实例。下面的查询语句q回所有的被持久化的对象:

from java.lang.Object o接口Named 可能被各U各L持久化类声明Q?

from Named n, Named m where n.name = m.name注意Q最后的两个查询需要超q一个的SQL SELECT.q表明order by子句 没有Ҏ(gu)个结果集q行正确的排? (q也说明你不能对q样的查询用Query.scroll()Ҏ(gu).)

15.7. where子句
where子句允许你将q回的实例列表的范围~小. 如果没有指定别名Q你可以使用属性名来直接引用属?

from Cat where name='Fritz'如果指派了别名,需要用完整的属性名:

from Cat as cat where cat.name='Fritz'q回名ؓQ属性name{于Q?Fritz'的Catcȝ实例?

select foo
from Foo foo, Bar bar
where foo.startDate = bar.date返回所有满下面条件的Foocȝ实例Q?存在如下的bar的一个实例,其date属性等?Foo的startDate属性?复合路径表达式得where子句非常的强大,考虑如下情况Q?

from Cat cat where cat.mate.name is not null该查询将被翻译成Z个含有表q接Q内q接Q的SQL查询。如果你打算写像q样的查询语?

from Foo foo
where foo.bar.baz.customer.address.city is not null在SQL中,你ؓ达此目的需要进行一个四表连接的查询?

=q算W不仅可以被用来比较属性的|也可以用来比较实例:

from Cat cat, Cat rival where cat.mate = rival.mateselect cat, mate
from Cat cat, Cat mate
where cat.mate = mateҎ(gu)属性(写Qid可以用来表示一个对象的唯一的标识符。(你也可以使用该对象的属性名。)

from Cat as cat where cat.id = 123
from Cat as cat where cat.mate.id = 69W二个查询是有效的。此时不需要进行表q接Q?

同样也可以用复合标识符。比如PersoncL一个复合标识符Q它由country属?与medicareNumber属性组成?

from bank.Person person
where person.id.country = 'AU'
and person.id.medicareNumber = 123456from bank.Account account
where account.owner.id.country = 'AU'
and account.owner.id.medicareNumber = 123456W二个查询也不需要进行表q接?

同样的,Ҏ(gu)属性class在进行多态持久化的情况下被用来存取一个实例的鉴别|discriminator valueQ?一个嵌入到where子句中的Javacȝ名字被转换cȝ鉴别倹{?

from Cat cat where cat.class = DomesticCat你也可以声明一个属性的cd是组件或者复合用L型(以及q件构成的lg{等Q。永q不要尝试用以lgcd来结路径表达式(path-expressionQ?Q与此相反,你应当用组件的一个属性来l尾Q?举例来说Q如果store.owner含有一个包含了lg的实体address

store.owner.address.city    // 正确
store.owner.address         // 错误!一?#8220;L”cd有两个特D的属性id和class, 来允许我们按照下面的方式表达一个连接(AuditLog.item 是一个属性,该属性被映射?lt;any>Q?

from AuditLog log, Payment payment
where log.item.class = 'Payment' and log.item.id = payment.id注意Q在上面的查询与句中Qlog.item.class ?payment.class 涉及到完全不同的数据库中的列?

15.8. 表达?br /> 在where子句中允怋用的表达式包?大多C可以在SQL使用的表辑ּU类:

数学q算W?, -, *, /

二进制比较运符=, >=, <=, <>, !=, like

逻辑q算Wand, or, not

in, not in, between, is null, is not null, is empty, is not empty, member of and not member of

"单的" case, case ... when ... then ... else ... end,?"搜烦" case, case when ... then ... else ... end

字符串连接符...||... or concat(...,...)

current_date(), current_time(), current_timestamp()

second(...), minute(...), hour(...), day(...), month(...), year(...),

EJB-QL 3.0定义的Q何函数或操作Qsubstring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length()

coalesce() ?nullif()

cast(... as ...), 其第二个参数是某Hibernatecd的名字,以及extract(... from ...)Q只要ANSI cast() ?extract() 被底层数据库支持

M数据库支持的SQL标量函数Q比如sign(), trunc(), rtrim(), sin()

JDBC参数传入 ?

命名参数:name, :start_date, :x1

SQL 直接帔R 'foo', 69, '1970-01-01 10:00:01.0'

Java public static final cd的常?eg.Color.TABBY

关键字in与between可按如下Ҏ(gu)使用:

from DomesticCat cat where cat.name between 'A' and 'B'from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )而且否定的格式也可以如下书写Q?

from DomesticCat cat where cat.name not between 'A' and 'B'from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )同样, 子句is null与is not null可以被用来测试空?null).

在Hibernate配置文g中声明HQL“查询替代Qquery substitutionsQ?#8221;之后Q?布尔表达式(BooleansQ可以在其他表达式中L的?

<property name="hibernate.query.substitutions">true 1, false 0</property>pȝ该HQL转换为SQL语句Ӟ该设|表明将用字W?1 ?0 ?取代关键字true ?false:

from Cat cat where cat.alive = true你可以用Ҏ(gu)属性size, 或是Ҏ(gu)函数size()试一个集合的大小?

from Cat cat where cat.kittens.size > 0from Cat cat where size(cat.kittens) > 0对于索引了(有序Q的集合Q你可以使用minindex ?maxindex函数来引用到最与最大的索引序数?同理Q你可以使用minelement ?maxelement函数?引用C个基本数据类型的集合中最与最大的元素?

from Calendar cal where maxelement(cal.holidays) > current datefrom Order order where maxindex(order.items) > 100from Order order where minelement(order.items) > 10000在传递一个集合的索引集或者是元素?elements与indices 函数) 或者传递一个子查询的结果的时候,可以使用SQL函数any, some, all, exists, in

select mother from Cat as mother, Cat as kit
where kit in elements(foo.kittens)select p from NameList list, Person p
where p.name = some elements(list.names)from Cat cat where exists elements(cat.kittens)from Player p where 3 > all elements(p.scores)from Show show where 'fizard' in indices(show.acts)注意Q在Hibernate3U,q些l构变量- size, elements, indices, minindex, maxindex, minelement, maxelement - 只能在where子句中用?

一个被索引q的Q有序的Q集合的元素(arrays, lists, maps)可以在其他烦引中被引用(只能在where子句中)Q?

from Order order where order.items[0].id = 1234select person from Person person, Calendar calendar
where calendar.holidays['national day'] = person.birthDay
and person.nationality.calendar = calendarselect item from Item item, Order order
where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11select item from Item item, Order order
where order.items[ maxindex(order.items) ] = item and order.id = 11在[]中的表达式甚臛_以是一个算数表辑ּ?

select item from Item item, Order order
where order.items[ size(order.items) - 1 ] = item对于一个一对多的关联(one-to-many associationQ或是值的集合中的元素Q?HQL也提供内建的index()函数Q?

select item, index(item) from Order order
join order.items item
where index(item) < 5如果底层数据库支持标量的SQL函数Q它们也可以被?

from DomesticCat cat where upper(cat.name) like 'FRI%'如果你还不能Ҏ(gu)有的q些׃不疑Q想想下面的查询。如果用SQLQ语句长度会增长多少Q可L会下降多少Q?

select cust
from Product prod,
Store store
inner join store.customers cust
where prod.name = 'widget'
and store.location.name in ( 'Melbourne', 'Sydney' )
and prod = all elements(cust.currentOrder.lineItems)提示: 会像如下的语?

SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order
FROM customers cust,
stores store,
locations loc,
store_customers sc,
product prod
WHERE prod.name = 'widget'
AND store.loc_id = loc.id
AND loc.name IN ( 'Melbourne', 'Sydney' )
AND sc.store_id = store.id
AND sc.cust_id = cust.id
AND prod.id = ALL(
SELECT item.prod_id
FROM line_items item, orders o
WHERE item.order_id = o.id
AND cust.current_order = o.id
)15.9. order by子句
查询q回的列?list)可以按照一个返回的cLlgQcomponents)中的M属性(propertyQ进行排序:

from DomesticCat cat
order by cat.name asc, cat.weight desc, cat.birthdate可选的asc或desc关键字指明了按照升序或降序进行排?

15.10. group by子句
一个返回聚集?aggregate values)的查询可以按照一个返回的cLlgQcomponents)中的M属性(propertyQ进行分l:

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.colorselect foo.id, avg(name), max(name)
from Foo foo join foo.names name
group by foo.idhaving子句在这里也允许使用.

select cat.color, sum(cat.weight), count(cat)
from Cat cat
group by cat.color
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)如果底层的数据库支持的话(例如不能在MySQL中?QSQL的一般函C聚集函数也可以出?在having与order by 子句中?

select cat
from Cat cat
join cat.kittens kitten
group by cat
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc注意group by子句?order by子句中都不能包含术表达式(arithmetic expressionsQ?

15.11. 子查?br /> 对于支持子查询的数据库,Hibernate支持在查询中使用子查询。一个子查询必须被圆括号包围hQ经常是SQL聚集函数的圆括号Q?甚至怺兌的子查询Q引用到外部查询中的别名的子查询Q也是允许的?

from Cat as fatcat
where fatcat.weight > (
select avg(cat.weight) from DomesticCat cat
)from DomesticCat as cat
where cat.name = some (
select name.nickName from Name as name
)from Cat as cat
where not exists (
from Cat as mate where mate.mate = cat
)from DomesticCat as cat
where cat.name not in (
select name.nickName from Name as name
)在select列表中包含一个表辑ּ以上的子查询Q你可以使用一个元l构造符Qtuple constructorsQ:

from Cat as cat
where not ( cat.name, cat.color ) in (
select cat.name, cat.color from DomesticCat cat
)注意在某些数据库中(不包括Oracle与HSQLQ,你也可以在其他语境中使用元组构造符Q?比如查询用户cd的组件与l合Q?

from Person where name = ('Gavin', 'A', 'King')该查询等价于更复杂的Q?

from Person where name.first = 'Gavin' and name.initial = 'A' and name.last = 'King')有两个很好的理由使你不应当作q样的事情:首先Q它不完全适用于各个数据库q_Q其ơ,查询现在依赖于映文件中属性的序?

15.12. HQLCZ
Hibernate查询可以非常的强大与复杂。实际上QHibernate的一个主要卖点就是查询语句的威力。这里有一些例子,它们与我在最q的 一个项目中使用的查询非常相伹{注意你能用到的大多数查询比q些要简单的多!

下面的查询对于某个特定的客户的所有未支付的̎单,在给定给最Mh(hun)值的情况下,q回订单的idQ条目的数量和Mh(hun)| q回值按照Mh(hun)值的l果q行排序。ؓ了决定h(hun)|查询使用了当前目录。作{换结果的SQL查询Q用了ORDER, ORDER_LINE, PRODUCT, CATALOG 和PRICE 库表?

select order.id, sum(price.amount), count(item)
from Order as order
join order.lineItems as item
join item.product as product,
Catalog as catalog
join catalog.prices as price
where order.paid = false
and order.customer = :customer
and price.product = product
and catalog.effectiveDate < sysdate
and catalog.effectiveDate >= all (
select cat.effectiveDate
from Catalog as cat
where cat.effectiveDate < sysdate
)
group by order
having sum(price.amount) > :minAmount
order by sum(price.amount) descq简直是一个怪物Q实际上Q在现实生活中,我ƈ不热衷于子查询,所以我的查询语句看h更像q个Q?

select order.id, sum(price.amount), count(item)
from Order as order
join order.lineItems as item
join item.product as product,
Catalog as catalog
join catalog.prices as price
where order.paid = false
and order.customer = :customer
and price.product = product
and catalog = :currentCatalog
group by order
having sum(price.amount) > :minAmount
order by sum(price.amount) desc下面一个查询计每一U状态下的支付的数目Q除L有处于AWAITING_APPROVAL状态的支付Q因为在该状态下 当前的用户作Z状态的最新改变。该查询被{换成含有两个内连接以及一个相兌的子选择的SQL查询Q该查询使用了表 PAYMENT, PAYMENT_STATUS 以及 PAYMENT_STATUS_CHANGE?

select count(payment), status.name
from Payment as payment
join payment.currentStatus as status
join payment.statusChanges as statusChange
where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
or (
statusChange.timeStamp = (
select max(change.timeStamp)
from PaymentStatusChange change
where change.payment = payment
)
and statusChange.user <> :currentUser
)
group by status.name, status.sortOrder
order by status.sortOrder如果我把statusChanges实例集映ؓ一个列表(listQ而不是一个集合(setQ? 书写查询语句更加简?

select count(payment), status.name
from Payment as payment
join payment.currentStatus as status
where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
or payment.statusChanges[ maxIndex(payment.statusChanges) ].user <> :currentUser
group by status.name, status.sortOrder
order by status.sortOrder下面一个查询用了MS SQL Server?isNull()函数用以q回当前用户所属组l的l织帐号及组l未支付的̎?它被转换成一个对表ACCOUNT, PAYMENT, PAYMENT_STATUS, ACCOUNT_TYPE, ORGANIZATION 以及 ORG_USERq行的三个内q接Q?一个外q接和一个子选择的SQL查询?

select account, payment
from Account as account
left outer join account.payments as payment
where :currentUser in elements(account.holder.users)
and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)
order by account.type.sortOrder, account.accountNumber, payment.dueDate对于一些数据库Q我们需要弃用(相关的)子选择?

select account, payment
from Account as account
join account.holder.users as user
left outer join account.payments as payment
where :currentUser = user
and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)
order by account.type.sortOrder, account.accountNumber, payment.dueDate15.13. 扚w的UPDATE & DELETE语句
HQL现在支持UPDATE与DELETE语句. 查阅 W?14.3 ?“大批量更?删除QBulk update/deleteQ?#8221; 以获得更多信息?

15.14. 技?& 窍?br /> 你可以统计查询结果的数目而不必实际的q回他们Q?

( (Integer) session.iterate("select count(*) from ....").next() ).intValue()若想Ҏ(gu)一个集合的大小来进行排序,可以使用如下的语句:

select usr.id, usr.name
from User as usr
left join usr.messages as msg
group by usr.id, usr.name
order by count(msg)如果你的数据库支持子选择Q你可以在你的查询的where子句中ؓ选择的大(selection sizeQ指定一个条?

from User usr where size(usr.messages) >= 1如果你的数据库不支持子选择语句Q用下面的查询Q?

select usr.id, usr.name
from User usr.name
join usr.messages msg
group by usr.id, usr.name
having count(msg) >= 1因ؓ内连接(inner joinQ的原因Q这个解x案不能返回含有零个信息的User cȝ实例, 所以这U情况下使用下面的格式将是有帮助?

select usr.id, usr.name
from User as usr
left join usr.messages as msg
group by usr.id, usr.name
having count(msg) = 0JavaBean的属性可以被l定C个命名查询(named queryQ的参数上:

Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size");
q.setProperties(fooBean); // fooBean包含Ҏ(gu)getName()与getSize()
List foos = q.list();通过接口Query与一个过滤器QfilterQ一起用,集合QCollectionsQ是可以分页的:

Query q = s.createFilter( collection, "" ); // 一个简单的qo?br /> q.setMaxResults(PAGE_SIZE);
q.setFirstResult(PAGE_SIZE * pageNumber);
List page = q.list();通过使用查询qo器(query filterQ可以将集合QCollectionQ的原素分组或排?

Collection orderedCollection = s.filter( collection, "order by this.amount" );
Collection counts = s.filter( collection, "select this.type, count(this) group by this.type" );不用通过初始化,你就可以知道一个集合(CollectionQ的大小Q?

( (Integer) session.iterate("select count(*) from ....").next() ).intValue();W?16 ?nbsp; 条g查询(Criteria Queries)
h一个直观的、可扩展的条件查询API是Hibernate的特艌Ӏ?

16.1. 创徏一个Criteria 实例
org.hibernate.Criteria接口表示特定持久cȝ一个查询。Session?Criteria实例的工厂?

Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();16.2. 限制l果集内?br /> 一个单独的查询条g是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictionsc?定义了获得某些内|Criterioncd的工厂方法?

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.between("weight", minWeight, maxWeight) )
.list();U束可以按逻辑分组?

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.or(
Restrictions.eq( "age", new Integer(0) ),
Restrictions.isNull("age")
) )
.list();List cats = sess.createCriteria(Cat.class)
.add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
.add( Restrictions.disjunction()
.add( Restrictions.isNull("age") )
.add( Restrictions.eq("age", new Integer(0) ) )
.add( Restrictions.eq("age", new Integer(1) ) )
.add( Restrictions.eq("age", new Integer(2) ) )
) )
.list();Hibernate提供了相当多的内|criterioncd(Restrictions 子类), 但是其有用的是可以允许你直接用SQL?

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )
.list();{alias}占位W应当被替换查询实体的列别名?

Property实例是获得一个条件的另外一U途径。你可以通过调用Property.forName() 创徏一个Property?

Property age = Property.forName("age");
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.disjunction()
.add( age.isNull() )
.add( age.eq( new Integer(0) ) )
.add( age.eq( new Integer(1) ) )
.add( age.eq( new Integer(2) ) )
) )
.add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
.list();16.3. l果集排?br /> 你可以用org.hibernate.criterion.Order来ؓ查询l果排序?

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();List cats = sess.createCriteria(Cat.class)
.add( Property.forName("name").like("F%") )
.addOrder( Property.forName("name").asc() )
.addOrder( Property.forName("age").desc() )
.setMaxResults(50)
.list();16.4. 兌
你可以用createCriteria()非常Ҏ(gu)的在互相兌的实体间建立 U束?

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.createCriteria("kittens")
.add( Restrictions.like("name", "F%")
.list();注意W二?createCriteria()q回一个新?Criteria实例Q该实例引用kittens 集合中的元素?

接下来,替换形态在某些情况下也是很有用的?

List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Restrictions.eqProperty("kt.name", "mt.name") )
.list();(createAlias()q不创徏一个新?Criteria实例?

Cat实例所保存的之前两ơ查询所q回的kittens集合?没有被条仉qo的。如果你希望只获得符合条件的kittensQ?你必M用returnMaps()?

List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Restrictions.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}16.5. 动态关联抓?br /> 你可以用setFetchMode()在运行时定义动态关联抓取的语义?

List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();q个查询可以通过外连接抓取mate和kittens?查看W?20.1 ?“ 抓取{略(Fetching strategies) ”可以获得更多信息?

16.6. 查询CZ
org.hibernate.criterion.Examplecd怽通过一个给定实?构徏一个条件查询?

Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list();版本属性、标识符和关联被忽略。默认情况下gؓnull的属性将被排除?

你可以自行调整Example使之更实用?

Example example = Example.create(cat)
.excludeZeroes()           //exclude zero valued properties
.excludeProperty("color")  //exclude the property named "color"
.ignoreCase()              //perform case insensitive string comparisons
.enableLike();             //use like for string comparisons
List results = session.createCriteria(Cat.class)
.add(example)
.list();你甚臛_以用examples在关联对象上攄条g?

List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.createCriteria("mate")
.add( Example.create( cat.getMate() ) )
.list();16.7. 投媄(Projections)、聚合(aggregationQ和分组QgroupingQ?br /> org.hibernate.criterion.Projections?Projection 的实例工厂。我们通过调用 setProjection()应用投媄C个查询?

List results = session.createCriteria(Cat.class)
.setProjection( Projections.rowCount() )
.add( Restrictions.eq("color", Color.BLACK) )
.list();List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount() )
.add( Projections.avg("weight") )
.add( Projections.max("weight") )
.add( Projections.groupProperty("color") )
)
.list();在一个条件查询中没有必要昑ּ的?"group by" 。某些投q型就是被定义?分组投媄Q他们也出现在SQL的group by子句中?

你可以选择把一个别名指z一个投影,q样可以使投影DU束或排序所引用。下面是两种不同的实现方式:

List results = session.createCriteria(Cat.class)
.setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
.addOrder( Order.asc("colr") )
.list();List results = session.createCriteria(Cat.class)
.setProjection( Projections.groupProperty("color").as("colr") )
.addOrder( Order.asc("colr") )
.list();alias()和as()Ҏ(gu)便的一个投影实例包装到另外一?别名的Projection实例中。简而言之,当你d一个投影到一个投影列表中?你可以ؓ它指定一个别名:

List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount(), "catCountByColor" )
.add( Projections.avg("weight"), "avgWeight" )
.add( Projections.max("weight"), "maxWeight" )
.add( Projections.groupProperty("color"), "color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder( Order.desc("avgWeight") )
.list();List results = session.createCriteria(Domestic.class, "cat")
.createAlias("kittens", "kit")
.setProjection( Projections.projectionList()
.add( Projections.property("cat.name"), "catName" )
.add( Projections.property("kit.name"), "kitName" )
)
.addOrder( Order.asc("catName") )
.addOrder( Order.asc("kitName") )
.list();你也可以使用Property.forName()来表C投影:

List results = session.createCriteria(Cat.class)
.setProjection( Property.forName("name") )
.add( Property.forName("color").eq(Color.BLACK) )
.list();List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount().as("catCountByColor") )
.add( Property.forName("weight").avg().as("avgWeight") )
.add( Property.forName("weight").max().as("maxWeight") )
.add( Property.forName("color").group().as("color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder( Order.desc("avgWeight") )
.list();16.8. ȝ(detached)查询和子查询
DetachedCriteriacM你在一个session范围之外创徏一个查询,q且可以使用L?Session来执行它?

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
.add( Property.forName("sex").eq('F') );
Session session = ....;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();DetachedCriteria也可以用以表C子查询。条件实例包含子查询可以通过 Subqueries或者Property获得?

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
.add( Property.forName("weight).gt(avgWeight) )
.list();DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
.add( Subqueries.geAll("weight", weights) )
.list();甚至怺兌的子查询也是有可能的Q?

DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
.setProjection( Property.forName("weight").avg() )
.add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
.add( Property.forName("weight).gt(avgWeightForSex) )
.list();W?17 ?Native SQL查询
你也可以使用你的数据库的Native SQL语言来查询数据。这对你在要使用数据库的某些Ҏ(gu)的时?比如说在查询提示或者Oracle中的 CONNECT关键?Q这是非常有用的。这p够扫清你把原来直接用SQL/JDBC 的程序迁UdZ Hibernate应用的道路上的障?

Hibernate3允许你用手写的sql来完成所有的create,update,delete,和load操作Q包括存储过E)

17.1. 创徏一个基于SQL的Query
SQL查询是通过SQLQuery接口来控制的Q它是通过调用Session.createSQLQuery()Ҏ(gu)来获?

List cats = sess.createSQLQuery("select {cat.*} from cats cat")
.addEntity("cat", Cat.class);
.setMaxResults(50);
.list();q个查询指定?

SQL查询语句Q它带一个占位符Q可以让Hibernate使用字段的别?

查询q回的实体,和它的SQL表的别名.

addEntity()Ҏ(gu)SQL表的别名和实体类联系hQƈ且确定查询结果集的Ş态?

addJoin()Ҏ(gu)可以被用于蝲入其他的实体和集合的兌QTODO:examples!

原生的SQL查询可能q回一个简单的标量值或者一个标量和实体的结合体?

Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE);
.uniqueResult();17.2. 别名和属性引?br /> 上面使用的{cat.*}标记?"所有属? 的简?你可以显式地列出需要的字段,但是你必让Hibernate 为每一个属性注入字D늚别名.q些字段的站位符是以字段别名为前?再加上属性名.在下面的例子?我们从一个其他的?cat_log) 中获取Cat对象,而非Cat对象原本在映元数据中声明的?注意我们甚至在where子句中也可以使用属性别? 对于命名查询,{}语法q不是必需?你可以在W?17.3 ?“命名SQL查询”得到更多的细?

String sql = "select cat.originalId as {cat.id}, " +
"cat.mateid as {cat.mate}, cat.sex as {cat.sex}, " +
"cat.weight*10 as {cat.weight}, cat.name as {cat.name} " +
"from cat_log cat where {cat.mate} = :catId"
List loggedCats = sess.createSQLQuery(sql)
.addEntity("cat", Cat.class)
.setLong("catId", catId)
.list();注意:如果你明地列出了每个属?你必d含这个类和它的子cȝ属? and its subclasses!

17.3. 命名SQL查询
可以在映文档中定义查询的名?然后可以象调用一个命名的HQL查询一L接调用命名SQL查询.在这U情况下,我们?需要调用addEntity()Ҏ(gu).

<sql-query name="mySqlQuery">
<return alias="person" class="eg.Person"/>
SELECT person.NAME AS {person.name},
person.AGE AS {person.age},
person.SEX AS {person.sex}
FROM PERSON person WHERE person.NAME LIKE 'Hiber%'
</sql-query>List people = sess.getNamedQuery("mySqlQuery")
.setMaxResults(50)
.list();一个命名查询可能会q回一个标量?你必M?lt;return-scalar>元素来指定字D늚别名?Hibernatecd

<sql-query name="mySqlQuery">
<return-scalar column="name" type="string"/>
<return-scalar column="age" type="long"/>
SELECT p.NAME AS name,
p.AGE AS age,
FROM PERSON p WHERE p.NAME LIKE 'Hiber%'
</sql-query><return-join>?lt;load-collection>元素分别用作 外连接和定义那些初始化集合的查询

17.3.1. 使用return-property来明地指定字段/别名
使用<return-property>你可以明的告诉Hibernate使用哪些字段,q和使用{}-语法 来让Hibernate注入它自q别名是相反的.

<sql-query name="mySqlQuery">
<return alias="person" class="eg.Person">
<return-property name="name" column="myName"/>
<return-property name="age" column="myAge"/>
<return-property name="sex" column="mySex"/>
</return>
SELECT person.NAME AS myName,
person.AGE AS myAge,
person.SEX AS mySex,
FROM PERSON person WHERE person.NAME LIKE :name
</sql-query>
<return-property>也可用于多个字段,它解决了使用{}-语法不能l粒度控制多个字D늚限制
<sql-query name="organizationCurrentEmployments">
<return alias="emp" class="Employment">
<return-property name="salary">
<return-column name="VALUE"/>
<return-column name="CURRENCY"/>
</return-property>
<return-property name="endDate" column="myEndDate"/>
</return>
SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
REGIONCODE as {emp.regionCode}, EID AS {emp.id}, VALUE, CURRENCY
FROM EMPLOYMENT
WHERE EMPLOYER = :id AND ENDDATE IS NULL
ORDER BY STARTDATE ASC
</sql-query>注意在这个例子中,我们使用?lt;return-property>l合{}的注入语? 允许用户来选择如何引用字段以及属?

如果你映一个识别器(discriminator),你必M?lt;return-discriminator>来指定识别器字段

17.3.2. 使用存储q程来查?br /> Hibernate 3引入了对存储q程查询的支? 存储q程必须q回一个结果集,作ؓHibernate能够使用的第一个外部参? 下面是一个Oracle9和更高版本的存储q程例子.

CREATE OR REPLACE FUNCTION selectAllEmployments
RETURN SYS_REFCURSOR
AS
st_cursor SYS_REFCURSOR;
BEGIN
OPEN st_cursor FOR
SELECT EMPLOYEE, EMPLOYER,
STARTDATE, ENDDATE,
REGIONCODE, EID, VALUE, CURRENCY
FROM EMPLOYMENT;
RETURN  st_cursor;
END;在Hibernate里要要用这个查?你需要通过命名查询来映它.

<sql-query name="selectAllEmployees_SP" callable="true">
<return alias="emp" class="Employment">
<return-property name="employee" column="EMPLOYEE"/>
<return-property name="employer" column="EMPLOYER"/>
<return-property name="startDate" column="STARTDATE"/>
<return-property name="endDate" column="ENDDATE"/>
<return-property name="regionCode" column="REGIONCODE"/>
<return-property name="id" column="EID"/>
<return-property name="salary">
<return-column name="VALUE"/>
<return-column name="CURRENCY"/>
</return-property>
</return>
{ ? = call selectAllEmployments() }
</sql-query>注意存储q程当前仅仅q回标量和实?现在不支?lt;return-join>?lt;load-collection>

17.3.2.1. 使用存储q程的规则和限制
Z在Hibernate中用存储过E?你必遵循一些规?不遵循这些规则的存储q程不可用.如果你仍然想要用他? 你必通过session.connection()来执行他?q些规则针对于不同的数据?因ؓ数据?提供商有各种不同的存储过E语法和语义.

对存储过E进行的查询无法使用setFirstResult()/setMaxResults()q行分页?

对于Oracle有如下规?

存储q程必须q回一个结果集.它通过q回SYS_REFCURSOR实现(在Oracle9?0),在Oracle里你需要定义一个REF CURSOR cd

推荐的格式是 { ? = call procName(<parameters>) } ?{ ? = call procName }(q更像是Oracle规则而不是Hibernate规则)

对于Sybase或者MS SQL server有如下规?

存储q程必须q回一个结果集?注意q些servers可能q回多个l果集以及更新的数目.Hibernate取出第一条结果集作ؓ它的q回| 其他被丢弃?

如果你能够在存储q程里设定SET NOCOUNT ONQ这可能会效率更高,但这不是必需的?

17.4. 定制SQL用来createQupdate和delete
Hibernate3能够使用定制的SQL语句来执行create,update和delete操作。在Hibernate中,持久化的cd集合已经 包含了一套配|期产生的语?insertsql, deletesql, updatesql{等)Q这些映标?<sql-insert>, <sql-delete>, and <sql-update>重蝲?q些语句?

<class name="Person">
<id name="id">
<generator class="increment"/>
</id>
<property name="name" not-null="true"/>
<sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert>
<sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update>
<sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
</class>q些SQL直接在你的数据库里执行,所以你可以自由的用你喜欢的Q意语法。但如果你用数据库特定的语法, q当然会降低你映的可移植性?

如果讑֮callableQ则能够支持存储q程了?

<class name="Person">
<id name="id">
<generator class="increment"/>
</id>
<property name="name" not-null="true"/>
<sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
<sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
<sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
</class>参数的位|顺序是非常重要的,他们必须和Hibernate所期待的顺序相同?

你能够通过讑֮日志调试U别为org.hiberante.persister.entity,来查看Hibernate所期待的顺序。在q个U别下, Hibernate会打印出create,update和delete实体的静态SQL。如果想看到预想中的序。记得不要将定制SQL包含在映文仉Q?因ؓ他们会重载Hibernate生成的静态SQL?

在大多数情况?最好这么做)Q存储过E需要返回插?更新/删除的行敎ͼ因ؓHibernate对语句的成功执行有些q行时的查?Hibernate怼把进行CUD操作的语句的W一个参数注册ؓ一个数值型输出参数?

CREATE OR REPLACE FUNCTION updatePerson (uid IN NUMBER, uname IN VARCHAR2)
RETURN NUMBER IS
BEGIN
update PERSON
set
NAME = uname,
where
ID = uid;
return SQL%ROWCOUNT;
END updatePerson;17.5. 定制装蝲SQL
你可能需要声明你自己的SQL(或HQL)来装载实?

<sql-query name="person">
<return alias="p" class="Person" lock-mode="upgrade"/>
SELECT NAME AS {p.name}, ID AS {p.id} FROM PERSON WHERE ID=? FOR UPDATE
</sql-query>q只是一个前面讨的命名查询声明,你可以在cL里引用q个命名查询?

<class name="Person">
<id name="id">
<generator class="increment"/>
</id>
<property name="name" not-null="true"/>
<loader query-ref="person"/>
</class>q也可以用于存储q程

TODO: 未完成的例子

<sql-query name="organizationEmployments">
<load-collection alias="empcol" role="Organization.employments"/>
SELECT {empcol.*}
FROM EMPLOYMENT empcol
WHERE EMPLOYER = :id
ORDER BY STARTDATE ASC, EMPLOYEE ASC
</sql-query>
<sql-query name="organizationCurrentEmployments">
<return alias="emp" class="Employment"/>
<synchronize table="EMPLOYMENT"/>
SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
REGIONCODE as {emp.regionCode}, ID AS {emp.id}
FROM EMPLOYMENT
WHERE EMPLOYER = :id AND ENDDATE IS NULL
ORDER BY STARTDATE ASC
</sql-query>W?18 ?qo数据
Hibernate3 提供了一U创新的方式来处理具?#8220;显?visibility)”规则的数据,那就是用Hibernate filter?Hibernate filter是全局有效的、具有名字、可以带参数的过滤器Q?对于某个特定的Hibernate session(zhn)可以选择是否启用Q或用Q某个过滤器?

18.1. Hibernate qo?filters)
Hibernate3新增了对某个cL者集合用预先定义的qo器条?filter criteria)的功能。过滤器条g相当于定义一?非常cM于类和各U集合上?#8220;where”属性的U束子句Q但是过滤器条g可以带参数?应用E序可以在运行时军_是否启用l定的过滤器Q以及用什么样的参数倹{?qo器的用法很像数据库视图,只不q是在应用程序中定使用什么样的参数的?

要用过滤器Q必首先在相应的映节点中定义。而定义一个过滤器Q要用到位于<hibernate-mapping/> 节点之内?lt;filter-def/>节点Q?

<filter-def name="myFilter">
<filter-param name="myFilterParam" type="string"/>
</filter-def>定义好之后,可以在某个cM使用q个qo器:

<class name="myClass" ...>
...
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</class>也可以在某个集合使用它:

<set ...>
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</set>可以在多个类或集合中使用某个qo器;某个cL者集合中也可以用多个过滤器?

Session对象中会用到的方法有QenableFilter(String filterName), getEnabledFilter(String filterName), ?disableFilter(String filterName). Session中默认是不启用过滤器的,必须通过Session.enabledFilter()Ҏ(gu)昑ּ的启用?该方法返回被启用的Filter的实例。以上文定义的过滤器ZQ?

session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");注意Qorg.hibernate.Filter的方法允讔R式方法调用。(cM上面例子中启用Filter之后讑֮Filter参数q个“Ҏ(gu)?#8221;Q?Hibernate的其他部分也大多有这个特性?

下面是一个比较完整的例子Q用了记录生效日期模式qo有时效的数据Q?

<filter-def name="effectiveDate">
<filter-param name="asOfDate" type="date"/>
</filter-def>
<class name="Employee" ...>
...
<many-to-one name="department" column="dept_id" class="Department"/>
<property name="effectiveStartDate" type="date" column="eff_start_dt"/>
<property name="effectiveEndDate" type="date" column="eff_end_dt"/>
...
<!--
Note that this assumes non-terminal records have an eff_end_dt set to
a max db date for simplicity-sake
注意Qؓ了简单v见,此处假设雇用关系生效期尚未结束的记录的eff_end_dt字段的值等于数据库最大的日期
-->
<filter name="effectiveDate"
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
</class>
<class name="Department" ...>
...
<set name="employees" lazy="true">
<key column="dept_id"/>
<one-to-many class="Employee"/>
<filter name="effectiveDate"
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
</set>
</class>定义好后Q如果想要保证取回的都是目前处于生效期的记录Q只需在获取雇员数据的操作之前先开启过滤器卛_Q?

Session session = ...;
session.enabledFilter("effectiveDate").setParameter("asOfDate", new Date());
List results = session.createQuery("from Employee as e where e.salary > :targetSalary")
.setLong("targetSalary", new Long(1000000))
.list();
在上面的HQL中,虽然我们仅仅昑ּ的用了一个薪水条Ӟ但因为启用了qo器,查询仅q回那些目前雇用 关系处于生效期的Qƈ且薪水高于一百万刀的雇员的数据?

注意Q如果你打算在用外q接Q或者通过HQL或load fetchingQ的同时使用qo器,要注意条件表辑ּ的方向(左还是右Q?最安全的方式是使用左外q接Qleft outer joiningQ。ƈ且通常来说Q先写参敎ͼ 然后是操作符Q最后写数据库字D名?

W?19 ?XML映射
注意q是Hibernate 3.0的一个实验性的Ҏ(gu)。这一Ҏ(gu)仍在积极开发中?

19.1. 用XML数据q行工作
Hibernate使得你可以用XML数据来进行工作,恰如你用持久化的POJOq行工作那样。解析过的XML?可以被认为是另外一U在对象层面上代替POJO来表C关pd数据的途径.

Hibernate支持采用dom4j作ؓ操作XML树的API。你可以写一个查询从数据库中索出 dom4j树,随后你对q颗树做的Q何修攚w自动同步回数据库。你甚至可以用dom4j解析 一XML文档Q然后用Hibernate的Q一基本操作它写入数据库: persist(), saveOrUpdate(), merge(), delete(), replicate() (合ƈ操作merge()目前q不支持)?

q一Ҏ(gu)可以应用在很多场合Q包括数据导入导出,通过JMS或SOAP表现实体数据以及 ZXSLT的报表?

一个单一的映就可以类的属性和XML文档的节点同时映到数据库。如果不需要映类Q?它也可以用来只映XML文档?

19.1.1. 指定同时映射XML和类
q是一个同时映POJO和XML的例子:

<class name="Account"
table="ACCOUNTS"
node="account">
<id name="accountId"
column="ACCOUNT_ID"
node="@id"/>
<many-to-one name="customer"
column="CUSTOMER_ID"
node="customer/@id"
embed-xml="false"/>
<property name="balance"
column="BALANCE"
node="balance"/>
...
</class>19.1.2. 只定义XML映射
q是一个不映射POJO的例子:

<class entity-name="Account"
table="ACCOUNTS"
node="account">
<id name="id"
column="ACCOUNT_ID"
node="@id"
type="string"/>
<many-to-one name="customerId"
column="CUSTOMER_ID"
node="customer/@id"
embed-xml="false"
entity-name="Customer"/>
<property name="balance"
column="BALANCE"
node="balance"
type="big_decimal"/>
...
</class>q个映射使得你既可以把数据作Zdom4j树那栯问,又可以作为由属性键值对(java Maps) l成的图那样讉K。属性名字是Ua逻辑上的l构Q你可以在HQL查询中引用它?

19.2. XML映射元数?br /> 许多Hibernate映射元素hnode属性。这使你可以指定用来保存 属性或实体数据的XML属性或元素。node属性必L下列格式之一Q?

"element-name" - 映射为指定的XML元素

"@attribute-name" - 映射为指定的XML属?/p>

"." - 映射为父元素

"element-name/@attribute-name" - 映射为指定元素的指定属?

对于集合和单值的兌Q有一个额外的embed-xml属性可用?q个属性的~省值是?embed-xml="true")。如果embed-xml="true"Q?则对应于被关联实体或值类型的集合的XML树将直接嵌入拥有q些兌的实体的XML树中?否则Q如果embed-xml="false"Q那么对于单值的兌Q仅被引用的实体的标识符出现?XML树中(被引用实体本w不出现)Q而集合则Ҏ(gu)不出现?

你应该小心,不要让太多关联的embed-xml属性ؓ?embed-xml="true")Q因为XML不能很好地处?循环引用!

<class name="Customer"
table="CUSTOMER"
node="customer">
<id name="id"
column="CUST_ID"
node="@id"/>
<map name="accounts"
node="."
embed-xml="true">
<key column="CUSTOMER_ID"
not-null="true"/>
<map-key column="SHORT_DESC"
node="@short-desc"
type="string"/>
<one-to-many entity-name="Account"
embed-xml="false"
node="account"/>
</map>
<component name="name"
node="name">
<property name="firstName"
node="first-name"/>
<property name="initial"
node="initial"/>
<property name="lastName"
node="last-name"/>
</component>
...
</class>在这个例子中Q我们决定嵌入帐目号?account id)的集合,但不嵌入实际的帐目数据。下面的HQL查询Q?

from Customer c left join fetch c.accounts where c.lastName like :lastNameq回的数据集是q样Q?

<customer id="123456789">
<account id="987632567" short-desc="Savings"/>
<account id="985612323" short-desc="Credit Card"/>
<name>
<first-name>Gavin</first-name>
<initial>A</initial>
<last-name>King</last-name>
</name>
...
</customer>如果你把一对多映射<one-to-many>的embed-xml属性置为真(embed-xml="true")Q?则数据看上去像q样Q?

<customer id="123456789">
<account id="987632567" short-desc="Savings">
<customer id="123456789"/>
<balance>100.29</balance>
</account>
<account id="985612323" short-desc="Credit Card">
<customer id="123456789"/>
<balance>-2370.34</balance>
</account>
<name>
<first-name>Gavin</first-name>
<initial>A</initial>
<last-name>King</last-name>
</name>
...
</customer>19.3. 操作XML数据
让我们来d和更新应用程序中的XML文档。通过获取一个dom4j会话可以做到q一点:

Document doc = ....;
Session session = factory.openSession();
Session dom4jSession = session.getSession(EntityMode.DOM4J);
Transaction tx = session.beginTransaction();
List results = dom4jSession
.createQuery("from Customer c left join fetch c.accounts where c.lastName like :lastName")
.list();
for ( int i=0; i<results.size(); i++ ) {
//add the customer data to the XML document
Element customer = (Element) results.get(i);
doc.add(customer);
}
tx.commit();
session.close();Session session = factory.openSession();
Session dom4jSession = session.getSession(EntityMode.DOM4J);
Transaction tx = session.beginTransaction();
Element cust = (Element) dom4jSession.get("Customer", customerId);
for ( int i=0; i<results.size(); i++ ) {
Element customer = (Element) results.get(i);
//change the customer name in the XML and database
Element name = customer.element("name");
name.element("first-name").setText(firstName);
name.element("initial").setText(initial);
name.element("last-name").setText(lastName);
}
tx.commit();
session.close();这一特色与Hibernate的replicate()操作l合h而实现的ZXML的数据导?导出非常有?


本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/ctgyp/archive/2007/12/18/1946626.aspx



helloworld2008 2009-10-18 16:30 发表评论
]]>
(2) Hibernate 数据兌 one to one(׃n主键)http://www.tkk7.com/zhaochengming/archive/2007/08/14/136659.htmlhelloworld2008helloworld2008Tue, 14 Aug 2007 05:58:00 GMThttp://www.tkk7.com/zhaochengming/archive/2007/08/14/136659.htmlhttp://www.tkk7.com/zhaochengming/comments/136659.htmlhttp://www.tkk7.com/zhaochengming/archive/2007/08/14/136659.html#Feedback1http://www.tkk7.com/zhaochengming/comments/commentRss/136659.htmlhttp://www.tkk7.com/zhaochengming/services/trackbacks/136659.htmlCREATE TABLE t_users
(
  id int4 NOT NULL DEFAULT nextval('t_user_id_seq'::text),
  age int4,
  name varchar(30),
  CONSTRAINT t_users_pkey PRIMARY KEY (id)
)
CREATE TABLE t_passports
(
  id int4 NOT NULL DEFAULT nextval('t_user_id_seq'::text),
  serial varchar(30),
  expiry int4,
  CONSTRAINT t_passports_pkey PRIMARY KEY (id),
  CONSTRAINT t_passports_id_fkey FOREIGN KEY (id)
      REFERENCES t_users (id) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT
)
W一部分 使用xml配置
源代码下?a href="http://www.tkk7.com/Files/zhaochengming/one2one%20xml配置格式?rar">http://www.tkk7.com/Files/zhaochengming/one2one%20xmlcomfig%20hibernate.rar
t_users和t_passportsҎ(gu)t_user.id一对一兌
TUsers.hbm.xml
<hibernate-mapping>
    <class name="com.tables.one2one.TUsers" table="t_users" schema="public">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="sequence">
            <param name="sequence">t_user_id_seq</param>
            </generator>

        </id>
        <property name="age" type="java.lang.Integer">
            <column name="age" />
        </property>
        <property name="name" type="java.lang.String">
            <column name="name" length="30" />
        </property>
        <!-- 如果cascade=none的话Q就不会U联更新?是说只在t_users中插入|在t_passports中不插入?-->
        <one-to-one name="passport" class="com.tables.one2one.TPassports"
         cascade="all" outer-join="true">
         
        </one-to-one>
    </class>
</hibernate-mapping>

TPassports.hbm.xml
<hibernate-mapping>
    <class name="com.tables.one2one.TPassports" table="t_passports" schema="public">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <!-- q里一定要Ҏ(gu)foreign -->
            <generator class="foreign">
            <param name="property">user</param>
            </generator>

        </id>
        <one-to-one name="user" class="com.tables.one2one.TUsers" constrained="true"></one-to-one>
        <property name="serial" type="java.lang.String">
            <column name="serial" length="30" />
        </property>
        <property name="expiry" type="java.lang.Integer">
            <column name="expiry" />
        </property>
    </class>
</hibernate-mapping>

public class One2OneTest extends BaseHibernateDAO {
      public void test() {
        TUsers user = new TUsers();
        user.setAge(100);
        user.setName("CEYLIN");
        TPassports passport = new TPassports();
        passport.setSerial("PCN1002211");
        passport.setExpiry(20080806);
        passport.setUser(user);
        user.setPassport(passport);
        Session session = this.getSession();
        Transaction tx = session.beginTransaction();
        session.save(user);
        tx.commit();
    }
}

W二部分 使用注解Q?/strong>
源代码下?nbsp; http://www.tkk7.com/Files/zhaochengming/one2oneAnno1.rar

package com;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="t_users")
public class TUser {
 @Id
 @Column(name = "user_id")
 @GeneratedValue(generator = "sequence")
 @SequenceGenerator(name = "sequence", sequenceName = "t_table_id_seq")
 private Integer id;
 
 @Column(name = "age")
 private Integer age;
 
 @Column(name= "name")
 private String name;
 
 @OneToOne(cascade = CascadeType.ALL)
 @PrimaryKeyJoinColumn
 private TPassport passport;

 public Integer getAge() {
  return age;
 }

 public void setAge(Integer age) {
  this.age = age;
 }

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public TPassport getPassport() {
  return passport;
 }

 public void setPassport(TPassport passport) {
  this.passport = passport;
 }
}

package com;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Entity
@Table(name = "t_passports")
public class TPassport {
 @Id
 @GeneratedValue(generator = "fk")
 @GenericGenerator(strategy = "foreign", name = "fk", parameters = @Parameter(name="property", value="user"))
 private Integer id;
 
 @Column(name = "serial")
 private String serial;
 
 @Column(name="expiry")
 private Integer expiry;
 
 @OneToOne(mappedBy="passport", optional = false)
 private TUser user;

 public Integer getExpiry() {
  return expiry;
 }

 public void setExpiry(Integer expiry) {
  this.expiry = expiry;
 }

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getSerial() {
  return serial;
 }

 public void setSerial(String serial) {
  this.serial = serial;
 }

 public TUser getUser() {
  return user;
 }

 public void setUser(TUser user) {
  this.user = user;
 }
}



helloworld2008 2007-08-14 13:58 发表评论
]]>
(1) Hibernate?U承Ş?/title><link>http://www.tkk7.com/zhaochengming/archive/2007/08/12/136193.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Sun, 12 Aug 2007 08:47:00 GMT</pubDate><guid>http://www.tkk7.com/zhaochengming/archive/2007/08/12/136193.html</guid><wfw:comment>http://www.tkk7.com/zhaochengming/comments/136193.html</wfw:comment><comments>http://www.tkk7.com/zhaochengming/archive/2007/08/12/136193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhaochengming/comments/commentRss/136193.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhaochengming/services/trackbacks/136193.html</trackback:ping><description><![CDATA[<p><strong>Hibernate</strong><strong>?/strong><strong>3</strong><strong>U承Ş?/strong></p> <p>1Q?nbsp;    表和子类之间的对立一对一关系 Table per concrete class<br></p> <p><strong>源码下蝲 </strong><a _fcksavedurl="http://download.csdn.net/source/226662"><strong><u><font color=#800080>http://download.csdn.net/source/226662</font></u></strong></a><br>2Q?nbsp;    每个子类对应一张子?q与ȝ׃n主表 Table per subclass<br></p> <p><strong>源码下蝲 http</strong><a _fcksavedurl="http://download.csdn.net/source/226662"><font color=#800080><font color=#002c99>://download.csdn.net/source/226728</font></font></a><br>3Q?nbsp;    表与cȝ一对多关系 Table per class hierarchy<br><strong>源码下蝲 http</strong><a _fcksavedurl="http://download.csdn.net/source/226662"><font color=#800080><font color=#002c99>://download.csdn.net/source/226783</font></font></a></p> <p>按照《深入潜出Hibernate》中介绍的,我们开始学习?/p> <p> </p> <p><strong>场景</strong>: ׃般的商品而言Q在具备某些共?? 名称,厂商),也有不同的属?如书有页敎ͼdvd有dvd的编码格?</p> <p> </p> <p><font color=#ff9900><strong><</strong><strong>一</strong><strong>> table per concerte class</strong></font></p> <p><font color=#00ccff><strong>(a)</strong> <strong>使用</strong><strong>xml</strong></font></p> <p>Titem 有两个子c? Tbook , TDvd, 那么Q所?#8220;表与子类之间的一对一的关p?#8221;Q也是每个子类对应一张数据库表。对应Tbook , TDvd</p> <p>数据库的表我们设计如?/p> <table cellSpacing=0 cellPadding=0 border=1> <tbody> <tr> <td vAlign=top width=247 colSpan=3> <p>?T_bool</p> </td> </tr> <tr> <td vAlign=top width=103> <p>id</p> </td> <td vAlign=top width=72> <p>Int</p> </td> <td vAlign=top width=72> <p>PK</p> </td> </tr> <tr> <td vAlign=top width=103> <p>Name</p> </td> <td vAlign=top width=72> <p>Varchar(50)</p> </td> <td vAlign=top width=72> <p> </p> </td> </tr> <tr> <td vAlign=top width=103> <p>Manufacturer</p> </td> <td vAlign=top width=72> <p>Varchar(50)</p> </td> <td vAlign=top width=72> <p> </p> </td> </tr> <tr> <td vAlign=top width=103> <p>Pagecount</p> </td> <td vAlign=top width=72> <p>int</p> </td> <td vAlign=top width=72> <p> </p> </td> </tr> </tbody> </table> <p> </p> <table cellSpacing=0 cellPadding=0 border=1> <tbody> <tr> <td vAlign=top width=256 colSpan=3> <p>?T_dvd</p> </td> </tr> <tr> <td vAlign=top width=103> <p>id</p> </td> <td vAlign=top width=81> <p>Int</p> </td> <td vAlign=top width=72> <p>PK</p> </td> </tr> <tr> <td vAlign=top width=103> <p>Name</p> </td> <td vAlign=top width=81> <p>Varchar(50)</p> </td> <td vAlign=top width=72> <p> </p> </td> </tr> <tr> <td vAlign=top width=103> <p>Manufacturer</p> </td> <td vAlign=top width=81> <p>Varchar(50)</p> </td> <td vAlign=top width=72> <p> </p> </td> </tr> <tr> <td vAlign=top width=103> <p>Codetype</p> </td> <td vAlign=top width=81> <p>Varchar(30)</p> </td> <td vAlign=top width=72> <p> </p> </td> </tr> </tbody> </table> <p align=left>/**</p> <p align=left>* 虚拟的表</p> <p align=left>* TItem 已经知道的承类?AbstractTBook AbstractTDvd</p> <p align=left>*/</p> <p align=left><strong>public</strong> <strong>abstract</strong> <strong>class</strong> TItem <strong>implements</strong> Serializable {</p> <p align=left>    <strong>private</strong> Integer id; </p> <p align=left>    <strong>private</strong> String name;</p> <p align=left>    <strong>private</strong> String manufacturer;</p> <p align=left>    <strong>public</strong> Integer getId() {</p> <p align=left>       <strong>return</strong> id;</p> <p align=left>       }</p> <p align=left>    <strong>public</strong> <strong>void</strong> setId(Integer id) {</p> <p align=left>       <strong>this</strong>.id = id;</p> <p align=left>       }</p> <p align=left>    <strong>public</strong> String getManufacturer() {</p> <p align=left>       <strong>return</strong> manufacturer;</p> <p align=left>       }</p> <p align=left>    <strong>public</strong> <strong>void</strong> setManufacturer(String manufacturer) {</p> <p align=left>       <strong>this</strong>.manufacturer = manufacturer;</p> <p align=left>       }</p> <p align=left>    <strong>public</strong> String getName() {</p> <p align=left>       <strong>return</strong> name;</p> <p align=left>       }</p> <p align=left>    <strong>public</strong> <strong>void</strong> setName(String name) {</p> <p align=left>       <strong>this</strong>.name = name;</p> <p align=left>       }</p> <p>}</p> <p align=left><strong>public</strong> <strong>abstract</strong> <strong>class</strong> AbstractTDvd <strong>extends</strong> TItem {</p> <p align=left>    <strong>private</strong> String codetype;</p> <p align=left>    <strong>public</strong> AbstractTDvd() {     }</p> <p align=left>    <strong>public</strong> String getCodetype() {</p> <p align=left>       <strong>return</strong> <strong>this</strong>.codetype;</p> <p align=left>       }</p> <p align=left>    <strong>public</strong> <strong>void</strong> setCodetype(String codetype) {</p> <p align=left>       <strong>this</strong>.codetype = codetype;</p> <p align=left>       }</p> <p>}</p> <p align=left><strong>public</strong> <strong>abstract</strong> <strong>class</strong> AbstractTBook <strong>extends</strong> TItem {</p> <p align=left>    <strong>private</strong> Integer pagecount;</p> <p align=left>    <strong>public</strong> AbstractTBook() {}</p> <p align=left>    <strong>public</strong> Integer getPagecount() {</p> <p align=left>       <strong>return</strong> <strong>this</strong>.pagecount;</p> <p align=left>       }</p> <p align=left>    <strong>public</strong> <strong>void</strong> setPagecount(Integer pagecount) {</p> <p align=left>       <strong>this</strong>.pagecount = pagecount;</p> <p align=left>       }</p> <p>}</p> <p align=left><strong>public</strong> <strong>class</strong> TDvd <strong>extends</strong> AbstractTDvd     {</p> <p align=left>    <strong>public</strong> TDvd() {}</p> <p>}</p> <p align=left><strong>public</strong> <strong>class</strong> TBook <strong>extends</strong> AbstractTDvd     {</p> <p align=left>    <strong>public</strong> TBook() {}</p> <p>}</p> <p> </p> <p><strong>Tbook.hbm.xml</strong></p> <p align=left><?xml version="1.0" encoding="utf-8"?></p> <p align=left><hibernate-mapping></p> <p align=left>       <class name="com.persist.tablePerConcreteClass.TBook" table="t_book" ></p> <p align=left>           <id name="id" type="java.lang.Integer"></p> <p align=left>               <column name="id" /></p> <p align=left>               <generator class="sequence"></p> <p align=left>               <param name="sequence">t_table_id_seq</param></p> <p align=left>               </generator></p> <p align=left>           </id></p> <p align=left>           <property name="name" type="java.lang.String"></p> <p align=left>               <column name="name" length="50" /></p> <p align=left>           </property></p> <p align=left>           <property name="manufacturer" type="java.lang.String"></p> <p align=left>               <column name="manufacturer" length="50" /></p> <p align=left>           </property></p> <p align=left>           <property name="pagecount" type="java.lang.Integer"></p> <p align=left>               <column name="pagecount" /></p> <p align=left>           </property></p> <p align=left>       </class></p> <p></hibernate-mapping></p> <p> </p> <p><strong>Tdvd.hbm.xml</strong></p> <p align=left><?xml version="1.0" encoding="utf-8"?></p> <p align=left><hibernate-mapping></p> <p align=left>       <class name="com.persist.tablePerConcreteClass.TDvd" table="t_dvd" ></p> <p align=left>           <id name="id" type="java.lang.Integer"></p> <p align=left>               <column name="id" /></p> <p align=left>               <generator class="sequence"></p> <p align=left>               <param name="sequence">t_table_id_seq</param></p> <p align=left>               </generator></p> <p align=left>           </id></p> <p align=left>           <property name="name" type="java.lang.String"></p> <p align=left>               <column name="name" length="50" /></p> <p align=left>           </property></p> <p align=left>           <property name="manufacturer" type="java.lang.String"></p> <p align=left>               <column name="manufacturer" length="50" /></p> <p align=left>           </property></p> <p align=left>           <property name="codetype" type="java.lang.String"></p> <p align=left>               <column name="codetype" length="50" /></p> <p align=left>           </property></p> <p align=left>       </class></p> <p></hibernate-mapping></p> <p> </p> <p><strong>Hibernate.cfg.xml</strong></p> <p align=left><?xml version='1.0' encoding='UTF-8'?></p> <p align=left><hibernate-configuration></p> <p align=left>       <session-factory></p> <p align=left>          <property name="dialect"></p> <p align=left>              org.hibernate.dialect.PostgreSQLDialect</p> <p align=left>          </property></p> <p align=left>          <property name="connection.url"></p> <p align=left>              jdbc:postgresql://localhost:5432/postgres</p> <p align=left>          </property></p> <p align=left>          <property name="connection.username">pgsql</property></p> <p align=left>          <property name="connection.password">pgsql</property></p> <p align=left>          <property name="connection.driver_class"></p> <p align=left>              org.postgresql.Driver</p> <p align=left>          </property></p> <p align=left>          <property name="myeclipse.connection.profile">pgsql</property></p> <p align=left>          <property name="show_sql">true</property></p> <p align=left>          <mapping resource="com/persist/tablePerConcreteClass/TBook.hbm.xml" /></p> <p align=left>          <mapping resource="com/persist/tablePerConcreteClass/TDvd.hbm.xml" /></p> <p align=left>       </session-factory></p> <p></hibernate-configuration></p> <p><strong>试用例</strong></p> <p align=left><strong>public</strong> <strong>class</strong> TBookDAO <strong>extends</strong> BaseHibernateDAO {</p> <p align=left>    <strong>public</strong> <strong>static</strong> <strong>void</strong> main(String args[]) {</p> <p align=left>       <strong>new</strong> TBookDAO().test();</p> <p align=left>       }</p> <p align=left>   </p> <p align=left>    <strong>public</strong> <strong>void</strong> test() {</p> <p align=left>          Session session = <strong>this</strong>.getSession();</p> <p align=left>          List list = session.createQuery(" from com.persist.tablePerConcreteClass.TItem").list();</p> <p align=left>          Iterator it = list.iterator();</p> <p align=left>       <strong>while</strong> (it.hasNext()) {</p> <p align=left>              TItem item = (TItem) it.next();</p> <p align=left>              System.<em>out</em>.println(item.getName());</p> <p align=left>          }</p> <p align=left>       }</p> <p>}</p> <p> </p> <p><font color=#00ccff><strong>(b)</strong> <strong>使用</strong><strong>hibernate</strong><strong>注解<br></strong></font><span>步骤</span><span>1</span><span>Q?/span> <span>修改</span><span>HibernateSessionFactory </span><span>中的</span><span>Configuration</span><span>?/span></p> <p><span>AnnotationConfiguration configuration = new AnnotationConfiguration();</span></p> <p><span>步骤</span><span>2</span><span>Q修?/span><span>hibernate.cfg.xml</span><span>中的</span></p> <p><span><mapping resource="com/persist/tablePerConcreteClass/TBook.hbm.xml" /></span></p> <p><span><mapping resource="com/persist/tablePerConcreteClass/TDvd.hbm.xml" /></span></p> <p><span>?/span></p> <p><span><mapping class="com.persist.tablePerConcreteClass.TBook"/></span></p> <p><span><mapping class="com.persist.tablePerConcreteClass.TDvd"/></span></p> <p><span>步骤</span><span>3</span><span>Q在</span><span>Titem, AbstractTBook, AbstractTBook</span><span>cM加注?/span></p> <p><span>@MappedSuperclass</span></p> <p><span>?/span><span>Titem</span></p> <p align=left><span>@MappedSuperclass</span></p> <p align=left><strong><span>public</span></strong><span> </span><strong><span>abstract</span></strong><span> </span><strong><span>class</span></strong><span> TItem </span><strong><span>implements</span></strong><span> Serializable {</span></p> <p align=left><span><span>    </span></span><span>@Id</span></p> <p align=left><span><span>    </span></span><span>@Column</span><span>(name = </span><span>"id"</span><span>)</span></p> <p align=left><span><span>    </span></span><span>@SequenceGenerator</span><span>(name = </span><span>"t_table_id_seq"</span><span>, sequenceName = </span><span>"t_table_id_seq"</span><span>)</span></p> <p align=left><span><span>    </span></span><strong><span>private</span></strong><span> Integer </span><span>id</span><span>;</span></p> <p align=left><span><span>    </span></span><span>@Column</span><span>(name = </span><span>"name"</span><span>)</span></p> <p align=left><span><span>    </span></span><strong><span>private</span></strong><span> String </span><span>name</span><span>;</span></p> <p align=left><span><span>    </span></span><span>@Column</span><span>(name = </span><span>"manufacturer"</span><span>)</span></p> <p align=left><span><span>    </span></span><strong><span>private</span></strong><span> String </span><span>manufacturer</span><span>;</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> Integer getId() {</span></p> <p align=left><span><span>       </span></span><strong><span>return</span></strong><span> </span><span>id</span><span>;</span></p> <p align=left><span><span>    </span>}</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setId(Integer id) {</span></p> <p align=left><span><span>       </span></span><strong><span>this</span></strong><span>.</span><span>id</span><span> = id;</span></p> <p align=left><span><span>    </span>}</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> String getManufacturer() {</span></p> <p align=left><span><span>       </span></span><strong><span>return</span></strong><span> </span><span>manufacturer</span><span>;</span></p> <p align=left><span><span>    </span>}</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setManufacturer(String manufacturer) {</span></p> <p align=left><span><span>       </span></span><strong><span>this</span></strong><span>.</span><span>manufacturer</span><span> = manufacturer;</span></p> <p align=left><span><span>    </span>}</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> String getName() {</span></p> <p align=left><span><span>       </span></span><strong><span>return</span></strong><span> </span><span>name</span><span>;</span></p> <p align=left><span><span>    </span>}</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setName(String name) {</span></p> <p align=left><span><span>       </span></span><strong><span>this</span></strong><span>.</span><span>name</span><span> = name;</span></p> <p align=left><span><span>    </span>}</span></p> <p><span>}</span></p> <p><span>AbstractTDvd</span></p> <p align=left><span>@<span>MappedSuperclass</span></span></p> <p align=left><strong><span>public</span></strong><span> </span><strong><span>class</span></strong><span> AbstractTDvd </span><strong><span>extends</span></strong><span> TItem {</span></p> <p align=left><span><span>    </span></span><span>@Column</span><span>(name = </span><span>"codetype"</span><span>)</span></p> <p align=left><span><span>    </span></span><strong><span>private</span></strong><span> String </span><span>codetype</span><span>;</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> AbstractTDvd() { }</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> String getCodetype() {</span></p> <p align=left><span><span>       </span></span><strong><span>return</span></strong><span> </span><strong><span>this</span></strong><span>.</span><span>codetype</span><span>;</span></p> <p align=left><span><span>    </span>}</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> setCodetype(String codetype) {</span></p> <p align=left><span><span>       </span></span><strong><span>this</span></strong><span>.</span><span>codetype</span><span> = codetype;</span></p> <p align=left><span><span>    </span>}</span></p> <p><span>}</span></p> <p><span>AbstractTBook</span></p> <p align=left><span>@MappedSuperclass</span></p> <p align=left><strong><span>public</span></strong><span> </span><strong><span>class</span></strong><span> AbstractTBook </span><strong><span>extends</span></strong><span> TItem {</span></p> <p align=left><span><span>    </span></span><span>@Column</span><span>(name = </span><span>"pagecount"</span><span>)</span></p> <p align=left><span><span>    </span></span><strong><span>private</span></strong><span> Integer </span><span>pagecount</span><span>;</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> AbstractTBook() {}</span></p> <p align=left><span><span>    </span></span><strong><span>public</span></strong><span> Integer getPagecount() {</span></p> <p align=left><span><span>       </span></span><strong><span>return</span></strong><span> </span><strong><span>this</span></strong><span>.</span><span>pagecount</span><span>;</span></p> <p align=left><span><span>    </span>}<span>   </span></span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> <span>setPagecount</span>(Integer pagecount) {</span></p> <p align=left><span><span>       </span></span><strong><span>this</span></strong><span>.</span><span>pagecount</span><span> = pagecount;</span></p> <p align=left><span><span>    </span>}</span></p> <p><span>}</span></p> <p><span>步骤</span><span>4</span><span>Q在</span><span>Tbook,TDvd</span><span>上加注解</span></p> <p align=left><span>@Entity</span></p> <p><span>@Table</span><span>(name = </span><span>"t_book"</span><span>)</span></p> <p><span>?/span></p> <p align=left><span>@Entity</span></p> <p><span>@Table</span><span>(name = </span><span>"t_dvd"</span><span>)</span></p> <p><span>调用的时候一?br>  </p> <p><strong><span><</span></strong><strong><span>?/span></strong><strong><span>></span><span> Table per subclass</span></strong><strong></strong></p> <p><span>父c?/span><span>Titem</span><span>单独映射C张主表,而ؓ</span><span>Tbook, TDvd</span><span>分别建立一张子表,子表和父表用外键来关?/span></p> <p><span>数据库的表我们设计如?/span></p> <p> <table cellSpacing=0 cellPadding=0 width=583 border=1> <tbody> <tr> <td vAlign=top width=583 colSpan=3> <p><span>?/span> <span>T_item</span></p> </td> </tr> <tr> <td vAlign=top width=208> <p><span>id</span></p> </td> <td vAlign=top width=81> <p><span>Int </span></p> </td> <td vAlign=top width=294> <p><span>PK</span></p> </td> </tr> <tr> <td vAlign=top width=208> <p><span>Name</span></p> </td> <td vAlign=top width=81> <p><span>Varchar(50)</span></p> </td> <td vAlign=top width=294> <p> </p> </td> </tr> <tr> <td vAlign=top width=208> <p><span>Manufacturer</span></p> </td> <td vAlign=top width=81> <p><span>Varchar(50)</span></p> </td> <td vAlign=top width=294> <p> </p> </td> </tr> <tr> <td vAlign=top width=583 colSpan=3> <p><span>CREATE TABLE t_item</span></p> <p><span>(</span></p> <p><span> id int4 NOT NULL DEFAULT nextval('t_table_id_seq'::regclass),</span></p> <p><span> name varchar(50),</span></p> <p><span> manufacturer varchar(50),</span></p> <p><span> CONSTRAINT t_item_pkey PRIMARY KEY (id)</span></p> <p><span>)</span></p> </td> </tr> </tbody> </table> </p> <p> </p> <p> </p> <p> <table cellSpacing=0 cellPadding=0 width=583 border=1> <tbody> <tr> <td vAlign=top width=583 colSpan=3> <p><span>?/span> <span>T_bool</span></p> </td> </tr> <tr> <td vAlign=top width=208> <p><span>id</span></p> </td> <td vAlign=top width=81> <p><span>Int </span></p> </td> <td vAlign=top width=294> <p><span>PK</span></p> </td> </tr> <tr> <td vAlign=top width=208> <p><span>Pagecount</span></p> </td> <td vAlign=top width=81> <p><span>int</span></p> </td> <td vAlign=top width=294> <p> </p> </td> </tr> <tr> <td vAlign=top width=583 colSpan=3> <p><span>CREATE TABLE t_book</span></p> <p><span>(</span></p> <p><span> id int4 NOT NULL,</span></p> <p><span> pagecount int4,</span></p> <p><span> CONSTRAINT t_book_pkey PRIMARY KEY (id),</span></p> <p><span> CONSTRAINT t_book_id_fkey FOREIGN KEY (id)</span></p> <p><span><span>      </span>REFERENCES t_item (id) MATCH SIMPLE</span></p> <p><span><span>      </span>ON UPDATE NO ACTION ON DELETE NO ACTION</span></p> <p><span>)</span></p> </td> </tr> </tbody> </table> </p> <p> </p> <p> <table cellSpacing=0 cellPadding=0 width=583 border=1> <tbody> <tr> <td vAlign=top width=583 colSpan=3> <p><span>?/span> <span>T_dvd</span></p> </td> </tr> <tr> <td vAlign=top width=103> <p><span>id</span></p> </td> <td vAlign=top width=81> <p><span>Int </span></p> </td> <td vAlign=top width=399> <p><span>PK</span></p> </td> </tr> <tr> <td vAlign=top width=103> <p><span>Codetype</span></p> </td> <td vAlign=top width=81> <p><span>Varchar(30)</span></p> </td> <td vAlign=top width=399> <p> </p> </td> </tr> <tr> <td vAlign=top width=583 colSpan=3> <p><span>CREATE TABLE t_dvd</span></p> <p><span>(</span></p> <p><span> id int4 NOT NULL,</span></p> <p><span> codetype varchar(30),</span></p> <p><span> CONSTRAINT t_dvd_pkey PRIMARY KEY (id),</span></p> <p><span> CONSTRAINT t_dvd_id_fkey FOREIGN KEY (id)</span></p> <p><span><span>     </span> REFERENCES t_item (id) MATCH SIMPLE</span></p> <p><span><span>      </span>ON UPDATE NO ACTION ON DELETE NO ACTION</span></p> <p><span>)</span></p> </td> </tr> </tbody> </table> </span></p>   <p _fckxhtmljob="2"><strong _fckxhtmljob="2">只有1个xml,TItem.hbm.xml</strong><br _fckxhtmljob="2"><hibernate-mapping><br _fckxhtmljob="2">     <class name="com.persist.tablePerConcreteClass.TItem" table="t_item"><br _fckxhtmljob="2">         <id name="id" type="java.lang.Integer"><br _fckxhtmljob="2">             <column name="id" /><br _fckxhtmljob="2">             <generator class="sequence"><br _fckxhtmljob="2">              <param name="sequence">t_table_id_seq</param><br _fckxhtmljob="2">             </generator><br _fckxhtmljob="2">         </id><br _fckxhtmljob="2">         <property name="name" type="java.lang.String"><br _fckxhtmljob="2">             <column name="name" length="50" /><br _fckxhtmljob="2">         </property><br _fckxhtmljob="2">         <property name="manufacturer" type="java.lang.String"><br _fckxhtmljob="2">             <column name="manufacturer" length="50" /><br _fckxhtmljob="2">         </property><br _fckxhtmljob="2">        <br _fckxhtmljob="2">         <joined-subclass name="com.persist.tablePerConcreteClass.TBook" table="t_book"><br _fckxhtmljob="2">          <key column="id"></key><br _fckxhtmljob="2">          <property name="pagecount" column="pagecount"><br _fckxhtmljob="2">          </property><br _fckxhtmljob="2">         </joined-subclass><br _fckxhtmljob="2">         <joined-subclass name="com.persist.tablePerConcreteClass.TDvd" table="t_dvd"><br _fckxhtmljob="2">          <key column="id"></key><br _fckxhtmljob="2">          <property name="codetype" column="codetype"><br _fckxhtmljob="2">          </property><br _fckxhtmljob="2">         </joined-subclass><br _fckxhtmljob="2">     </class><br _fckxhtmljob="2"></hibernate-mapping><br _fckxhtmljob="2"><strong _fckxhtmljob="2"><u _fckxhtmljob="2">使用注解</u></strong><br _fckxhtmljob="2"><strong _fckxhtmljob="2">1.TItem不ؓ抽象c?TItem的类注解?/strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_item")<br _fckxhtmljob="2">@Inheritance(strategy=InheritanceType.JOINED)<br _fckxhtmljob="2"><strong _fckxhtmljob="2">2.AbstractTBook和AbstractTDvd的类注解?/strong><br _fckxhtmljob="2">@PrimaryKeyJoinColumn(name="id")<br _fckxhtmljob="2"><strong _fckxhtmljob="2">3.TBook和TDvd的注解ؓ</strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_book")<br _fckxhtmljob="2">?br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_dvd")</p> <p><strong><span><</span></strong><strong><span>?/span></strong><strong><span>></span><span> Table per class hierarchy</span></strong><strong></strong></p> <p><span>CREATE TABLE t_item</span></p> <p><span>(</span></p> <p><span> id int4 NOT NULL DEFAULT nextval('t_table_id_seq'::regclass),</span></p> <p><span> name varchar(50),</span></p> <p><span> manufacturer varchar(50),</span></p> <p><span> category varchar(30),</span></p> <p><span> codetype varchar(30),</span></p> <p><span> pagecount int4,</span></p> <p><span> CONSTRAINT t_item_pkey PRIMARY KEY (id)</span></p> <p><span>)</span></p> <p _fckxhtmljob="2"><strong _fckxhtmljob="2">只有一个xml,TItem.hbm.xml</strong><br _fckxhtmljob="2"><hibernate-mapping><br _fckxhtmljob="2">    <class name="com.persist.tablePerConcreteClass.TItem" table="t_item"><br _fckxhtmljob="2">        <id name="id" type="java.lang.Integer"><br _fckxhtmljob="2">            <column name="id" /><br _fckxhtmljob="2">            <generator class="sequence"><br _fckxhtmljob="2">             <param name="sequence">t_table_id_seq</param><br _fckxhtmljob="2">            </generator><br _fckxhtmljob="2">        </id><br _fckxhtmljob="2">        <discriminator><br _fckxhtmljob="2">            <column name="category" length="10" /><br _fckxhtmljob="2">        </discriminator><br _fckxhtmljob="2">        <property name="name" type="java.lang.String"><br _fckxhtmljob="2">            <column name="name" length="50" /><br _fckxhtmljob="2">        </property><br _fckxhtmljob="2">        <property name="manufacturer" type="java.lang.String"><br _fckxhtmljob="2">            <column name="manufacturer" length="50" /><br _fckxhtmljob="2">        </property>        <br _fckxhtmljob="2">        <subclass name="com.persist.tablePerConcreteClass.TBook" discriminator-value="1"><br _fckxhtmljob="2">         <property name="pagecount" column="pagecount"><br _fckxhtmljob="2">         </property><br _fckxhtmljob="2">        </subclass><br _fckxhtmljob="2">        <subclass name="com.persist.tablePerConcreteClass.TDvd" discriminator-value="2" ><br _fckxhtmljob="2">         <property name="codetype" column="codetype"><br _fckxhtmljob="2">         </property><br _fckxhtmljob="2">        </subclass><br _fckxhtmljob="2">    </class><br _fckxhtmljob="2"></hibernate-mapping><br _fckxhtmljob="2"><strong _fckxhtmljob="2"><u _fckxhtmljob="2">注解的修改ؓ</u><br _fckxhtmljob="2">1.TItem的注解修改ؓ</strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@Table(name = "t_item")<br _fckxhtmljob="2">@Inheritance(strategy=InheritanceType.SINGLE_TABLE)<br _fckxhtmljob="2">@DiscriminatorColumn(name="category", discriminatorType=DiscriminatorType.STRING, length=30)<br _fckxhtmljob="2"><strong _fckxhtmljob="2">2.AbstractTBook, AbstractTDvd的注解修改ؓ</strong><br _fckxhtmljob="2">@Inheritance<br _fckxhtmljob="2"><strong _fckxhtmljob="2">3.TBook,TDvd的注解修改ؓ</strong><br _fckxhtmljob="2">@Entity<br _fckxhtmljob="2">@DiscriminatorValue(value="2")</p> <img src ="http://www.tkk7.com/zhaochengming/aggbug/136193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhaochengming/" target="_blank">helloworld2008</a> 2007-08-12 16:47 <a href="http://www.tkk7.com/zhaochengming/archive/2007/08/12/136193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://qiwangxuan.com" target="_blank">޹ƷۺϾþ20</a>| <a href="http://fense1.com " target="_blank">4338ȫɫվ</a>| <a href="http://h588888.com" target="_blank">99ƷƵ߹ۿѲ</a>| <a href="http://pyjxyey.com" target="_blank">ɫվ</a>| <a href="http://hzsprfm.com" target="_blank">aëƬ</a>| <a href="http://52xingai.com" target="_blank">˸ŮѲžþþ</a>| <a href="http://miyatb.com" target="_blank">йһȫƵѹۿ</a>| <a href="http://dangyuming.com" target="_blank">99þѹƷ</a>| <a href="http://hetaoqpj.com" target="_blank">APPѹۿƵ</a>| <a href="http://yongyihongze.com" target="_blank">91µַ</a>| <a href="http://963315.com" target="_blank">þۺϸϾþù </a>| <a href="http://sczxzt.com" target="_blank">Ƶۿ</a>| <a href="http://wx-jn.com" target="_blank">97se޹ۺ</a>| <a href="http://hs718.com" target="_blank">Ʒպþ</a>| <a href="http://91se01.com" target="_blank">޳aƬ߹ۿ</a>| <a href="http://ghiearning.com" target="_blank">avɱվ</a>| <a href="http://qianmiu.com" target="_blank">ɫƨƨ߹ۿƵ</a>| <a href="http://www-456446.com" target="_blank">ëƬ벻һ </a>| <a href="http://skcncar.com" target="_blank">ۺ϶</a>| <a href="http://dsfv1.com" target="_blank">պĻ</a>| <a href="http://an930.com" target="_blank">ۺa</a>| <a href="http://bisi666.com" target="_blank">99Ʒһ</a>| <a href="http://aqd1987.com" target="_blank">Ů˽Ƶwww</a>| <a href="http://038037.com" target="_blank">ĻþƷ</a>| <a href="http://6777s.com" target="_blank">69ʽƵ </a>| <a href="http://xiaomaomi8.com" target="_blank">AVһ</a>| <a href="http://gnebs.com" target="_blank">þûɫվ</a>| <a href="http://haiwaizhuyun.com" target="_blank">4ѵַ</a>| <a href="http://786087.com" target="_blank">㽶Ƶ߹ۿѹ</a>| <a href="http://bdgxhome.com" target="_blank">ĻƵ</a>| <a href="http://6nn5.com" target="_blank">99þѹػ</a>| <a href="http://shelaoban.com" target="_blank">þҹ</a>| <a href="http://hs969.com" target="_blank">ëƬaëƬѲ100</a>| <a href="http://qingdaostf.com" target="_blank">ŮڵƵվ</a>| <a href="http://qq367.com" target="_blank">Ƶһ</a>| <a href="http://nblfkj.com" target="_blank">޾Ʒѹۿ</a>| <a href="http://by3142.com" target="_blank">Ļ</a>| <a href="http://773311h.com" target="_blank">ĻƷѾþ</a>| <a href="http://bd0574.com" target="_blank">þþƷѹۿ</a>| <a href="http://shulan88.com" target="_blank">ĻӰѹۿ</a>| <a href="http://snbbearing.com" target="_blank">޹Ʒַ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>