m***g 发帖数: 28 | 1 没用过 hibernate, project 需要,想看看是不是合适
比如下面的 class
class A {
int id;
int a;
int b;
A next;
}
是不是 hibernate 没法映射 next,我必须自己转换成 List 才行
还有一个问题就是,每个 class 都必须有 id 么,没有系统可以自动生成么?
谢谢 |
w*******s 发帖数: 940 | 2 1. 可以的吧
@OneToOne
@JoinColumn(name = "XXX")
2. 用super class,然后下面的就是继承那个ID了
【在 m***g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没用过 hibernate, project 需要,想看看是不是合适 : 比如下面的 class : class A { : int id; : int a; : int b; : A next; : } : 是不是 hibernate 没法映射 next,我必须自己转换成 List 才行 : 还有一个问题就是,每个 class 都必须有 id 么,没有系统可以自动生成么?
|
t*******e 发帖数: 684 | 3 买本书看看吧。这些问题很基本,每本hibernate书都会提到。而且用了hibernate,以
后碰到的问题会越来越多的。 |
T*********g 发帖数: 496 | 4 简单说说我用Hibernate碰到的一些问题
1) 当SQL复杂到一定程度的时候,HQL和CRITERIA都非常难生成。
2) 当HIBERNATE升级的时候,很多兼容性问题。比如说你现在在用HIBERNATE 3.6,AP
P SERVER WEBLOGIC 10.3,假如你想要升级HIBERNATE到4.1,简直是场噩梦,太多HIBE
RNATE的DEPENDENCY,太多第三方的JAR和CONTAINER 提供的JAR有冲突。
3) CACHE。HIBERNATE的一级和二级缓存全部是关于ID的CACHE或者是QUERY CACHE。CA
CHE层被做到了DAO的下面,假设说我现在已经知道DATA实际就在CACHE里,而我想做基于
TABLE某个COLUMN的查找,HIBERNATE还是要DB SEARCH,因为它不知道应该在CACHE中查
找,这会大幅影响PERF。我觉得如果是大型项目的话,要避免HIBERNATE。可以考虑用SP
RING JDBC加某种分布式CACHE的结构,这样简单,快速,DEPEDENCY少。
【在 m***g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没用过 hibernate, project 需要,想看看是不是合适 : 比如下面的 class : class A { : int id; : int a; : int b; : A next; : } : 是不是 hibernate 没法映射 next,我必须自己转换成 List 才行 : 还有一个问题就是,每个 class 都必须有 id 么,没有系统可以自动生成么?
|
B*****g 发帖数: 34098 | 5 thanks。
还有没有其他大牛讲讲hibernate的其他好处。俺也在学hibernate,感觉太费劲,
hibernate能干的俺写SQL都不用动脑子。SPRING还不会,要看看直接jdbc缓存怎么用。
AP
HIBE
CA
基于
SP
【在 T*********g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 简单说说我用Hibernate碰到的一些问题 : 1) 当SQL复杂到一定程度的时候,HQL和CRITERIA都非常难生成。 : 2) 当HIBERNATE升级的时候,很多兼容性问题。比如说你现在在用HIBERNATE 3.6,AP : P SERVER WEBLOGIC 10.3,假如你想要升级HIBERNATE到4.1,简直是场噩梦,太多HIBE : RNATE的DEPENDENCY,太多第三方的JAR和CONTAINER 提供的JAR有冲突。 : 3) CACHE。HIBERNATE的一级和二级缓存全部是关于ID的CACHE或者是QUERY CACHE。CA : CHE层被做到了DAO的下面,假设说我现在已经知道DATA实际就在CACHE里,而我想做基于 : TABLE某个COLUMN的查找,HIBERNATE还是要DB SEARCH,因为它不知道应该在CACHE中查 : 找,这会大幅影响PERF。我觉得如果是大型项目的话,要避免HIBERNATE。可以考虑用SP : RING JDBC加某种分布式CACHE的结构,这样简单,快速,DEPEDENCY少。
|
T*********g 发帖数: 496 | 6 没有直接JDBC缓存。一个简单的方法是用AOP拦截所有DAO里操作DB的方法,实现对缓存
数据的先查找,或者后更新。
你可以通过HIBERNATE学习一些一般的对DB操作的知识,比如说怎么通过乐观锁来提高并
发,悲观锁是什么概念,应该怎么使用。如何设计long session等等。你可以看看gavi
n king和christan baur写的Hibernate in action
Hibernate现在衍生出了一些很有意思的小项目,比如Hibernate shard,我觉得要是有
空的话,看看也挺有意思的。
意见仅供参考,本人并非大牛。
【在 B*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : thanks。 : 还有没有其他大牛讲讲hibernate的其他好处。俺也在学hibernate,感觉太费劲, : hibernate能干的俺写SQL都不用动脑子。SPRING还不会,要看看直接jdbc缓存怎么用。 : : AP : HIBE : CA : 基于 : SP
|
g*****g 发帖数: 34805 | 7 Hibernate is an ORM. So the biggest benefit is the ORM, which
makes a clear layered structure, some level of DB independency.
e.g. If your project needs to support MySQL and Oracle at the
same time, it's much tougher to use plain SQL. Also, secondary
caching can be had with zero coding.
【在 B*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : thanks。 : 还有没有其他大牛讲讲hibernate的其他好处。俺也在学hibernate,感觉太费劲, : hibernate能干的俺写SQL都不用动脑子。SPRING还不会,要看看直接jdbc缓存怎么用。 : : AP : HIBE : CA : 基于 : SP
|
B*****g 发帖数: 34098 | 8 简单sql支持不同数据库根本不是问题,复杂的要不同,不过hibernate也不支持
现在只发现caching确实是个好东西
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Hibernate is an ORM. So the biggest benefit is the ORM, which : makes a clear layered structure, some level of DB independency. : e.g. If your project needs to support MySQL and Oracle at the : same time, it's much tougher to use plain SQL. Also, secondary : caching can be had with zero coding.
|
g*****g 发帖数: 34805 | 9 你低估了当你需要效率并有一定复杂度时ORM有多好用。
举个简单例子,一个20个column的user profile table.
每个column都可能被单独修改,而你又希望只写改动
的column。用JDBC你试试?
【在 B*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 简单sql支持不同数据库根本不是问题,复杂的要不同,不过hibernate也不支持 : 现在只发现caching确实是个好东西
|
B*****g 发帖数: 34098 | 10 re
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你低估了当你需要效率并有一定复杂度时ORM有多好用。 : 举个简单例子,一个20个column的user profile table. : 每个column都可能被单独修改,而你又希望只写改动 : 的column。用JDBC你试试?
|
|
|
r*****s 发帖数: 985 | 11 这玩儿本来没啥好争论的
sql vs hibernate就不是一层的东西
ORM的关键是mapping不是query
你不需要考虑mapping的问题就不需要hibernate
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你低估了当你需要效率并有一定复杂度时ORM有多好用。 : 举个简单例子,一个20个column的user profile table. : 每个column都可能被单独修改,而你又希望只写改动 : 的column。用JDBC你试试?
|
t*******e 发帖数: 684 | 12 感觉你的第一点导致了第三点的结论。
2nd-level cache是为lazy loading准备的。cache的key就是entity的primary key。只
有foreign key已知的情况,比如many-to-one,等等,这个cache才起作用。
一般情况下hibernate如何使用,看看RAD tool自动生成的code就明白了。lazy
loading为主,先把root object搞回来,再on demand搞relationships (2nd-level
cache有用了)。在java里面处理数据。如果performance太差了,再搞eager fetch来优
化。
Reporting database,ODS之类的会比较多用到复杂的query。这种情况2nd-level
cache几乎没用。query cache可以用,效果和spring cache一模一样,问题是你不知道
什么时候cache结果已经过时了。所以说用spring cache+jdbc效率的确差不多。
AP
HIBE
CA
基于
SP
【在 T*********g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 简单说说我用Hibernate碰到的一些问题 : 1) 当SQL复杂到一定程度的时候,HQL和CRITERIA都非常难生成。 : 2) 当HIBERNATE升级的时候,很多兼容性问题。比如说你现在在用HIBERNATE 3.6,AP : P SERVER WEBLOGIC 10.3,假如你想要升级HIBERNATE到4.1,简直是场噩梦,太多HIBE : RNATE的DEPENDENCY,太多第三方的JAR和CONTAINER 提供的JAR有冲突。 : 3) CACHE。HIBERNATE的一级和二级缓存全部是关于ID的CACHE或者是QUERY CACHE。CA : CHE层被做到了DAO的下面,假设说我现在已经知道DATA实际就在CACHE里,而我想做基于 : TABLE某个COLUMN的查找,HIBERNATE还是要DB SEARCH,因为它不知道应该在CACHE中查 : 找,这会大幅影响PERF。我觉得如果是大型项目的话,要避免HIBERNATE。可以考虑用SP : RING JDBC加某种分布式CACHE的结构,这样简单,快速,DEPEDENCY少。
|
T*********g 发帖数: 496 | 13 假设这样一种简单情况,我的MEM足够大,且我把某个表中所有的数据都已经LOAD到了C
ACHE中。我想实现的是对该表任意COLUMN的查询。HIBERNATE能有效的避免数据库命中吗
?我想不能。
【在 t*******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 感觉你的第一点导致了第三点的结论。 : 2nd-level cache是为lazy loading准备的。cache的key就是entity的primary key。只 : 有foreign key已知的情况,比如many-to-one,等等,这个cache才起作用。 : 一般情况下hibernate如何使用,看看RAD tool自动生成的code就明白了。lazy : loading为主,先把root object搞回来,再on demand搞relationships (2nd-level : cache有用了)。在java里面处理数据。如果performance太差了,再搞eager fetch来优 : 化。 : Reporting database,ODS之类的会比较多用到复杂的query。这种情况2nd-level : cache几乎没用。query cache可以用,效果和spring cache一模一样,问题是你不知道 : 什么时候cache结果已经过时了。所以说用spring cache+jdbc效率的确差不多。
|
T*********g 发帖数: 496 | 14 这个你说的很有道理。
我觉得在低并发,且开发效率优先的情况下,用ORM框架还是有好处的。
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你低估了当你需要效率并有一定复杂度时ORM有多好用。 : 举个简单例子,一个20个column的user profile table. : 每个column都可能被单独修改,而你又希望只写改动 : 的column。用JDBC你试试?
|
g*****g 发帖数: 34805 | 15 我不明白你在说啥,如果所有数据都在一级或者二级缓存里,
hibernate当然不会去数据库。
了C
中吗
【在 T*********g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 假设这样一种简单情况,我的MEM足够大,且我把某个表中所有的数据都已经LOAD到了C : ACHE中。我想实现的是对该表任意COLUMN的查询。HIBERNATE能有效的避免数据库命中吗 : ?我想不能。
|
t*******e 发帖数: 684 | 16 cache只对fetch by primary key有用,因为cache的key就是entity的ID, arbitrary
query还是map成SQL执行的。即便整个table都cache了,hibernate根本不懂在cache里执
行JPQL或SQL的。
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我不明白你在说啥,如果所有数据都在一级或者二级缓存里, : hibernate当然不会去数据库。 : : 了C : 中吗
|
T*********g 发帖数: 496 | 17 呵呵。基于某个COLUMN属性的查询,比如说 SELECT * FROM A a.prop = 1. 结果查询出
来之后,Hibernate把命中的对象放在二级缓存里,假如说全表所有的TUPLE都满足a.pr
op =1,那么其实全表都已经LOAD在内存里了。第二次查询的时候,我select * from A
where a.prop = 2。 虽然结果集已经在MEM里了,因为HIBERNATE不知道满足a.prop =
2的TUPLE有哪些,它还是会做SQL从DB里取,而且REFLECT生成结果集,并且重新REFRES
H二级缓存。所以,并不是说你的结果集已经在MEM中,HIBERNATE就不去DB了。这是HIB
ERNATE的DESIGN决定的。我觉得这不是一个有效率的好方法。
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我不明白你在说啥,如果所有数据都在一级或者二级缓存里, : hibernate当然不会去数据库。 : : 了C : 中吗
|
T*********g 发帖数: 496 | 18 是。所以我觉得用类似Coherence一类的CACHE框架,在去HIBERNATE 做DB操作之前先查
找会更有效率。不过这种DESIGN就是以分布式CACHE为中心了。
里执
【在 t*******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : cache只对fetch by primary key有用,因为cache的key就是entity的ID, arbitrary : query还是map成SQL执行的。即便整个table都cache了,hibernate根本不懂在cache里执 : 行JPQL或SQL的。
|
a*******n 发帖数: 237 | 19 用了n年的hinernate, 包括sharding. 也算半个砖家。
对我来说,hinernate的好处不在于object-relation-mapping. 数据库和对象的转换其
实很简单,有那么几百行程序就完全够用了。在我最近的一个项目中就自己实现了。
对我来说,hibernate的最大的好处是数据库table的自己创建。java类中增加了一个
field, hibernate就能自动在表中创建列。大大减少了开发人员的工作,提高了效率。
在单元测试中,用in-memory数据库的时候更是必不可少。这里也能体现hibernate的另
外一个好处就是隐藏了数据库之间的差异。
我用maven的时候,一般说来会创建几个profile, 比如 test, dev, stage, prod. 在
test profile中, 激活hibernate, 主要用于自动生成test需要的hsqldb in-memory
数据库。 在dev profile 中,一般说来是localhost mysql. 也激活hibernate, 帮我
自动生成mysql tables. 然后手工修改一些东西,比如创建fulltext 索引, trigger
等。stage和prod环境中完全不用hibernate. 我用自己写的一些orm和spring的
jdbctemplate.
【在 m***g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 没用过 hibernate, project 需要,想看看是不是合适 : 比如下面的 class : class A { : int id; : int a; : int b; : A next; : } : 是不是 hibernate 没法映射 next,我必须自己转换成 List 才行 : 还有一个问题就是,每个 class 都必须有 id 么,没有系统可以自动生成么?
|
s***o 发帖数: 2191 | 20 do you also implement change tracking within your own orm?
memory
【在 a*******n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 用了n年的hinernate, 包括sharding. 也算半个砖家。 : 对我来说,hinernate的好处不在于object-relation-mapping. 数据库和对象的转换其 : 实很简单,有那么几百行程序就完全够用了。在我最近的一个项目中就自己实现了。 : 对我来说,hibernate的最大的好处是数据库table的自己创建。java类中增加了一个 : field, hibernate就能自动在表中创建列。大大减少了开发人员的工作,提高了效率。 : 在单元测试中,用in-memory数据库的时候更是必不可少。这里也能体现hibernate的另 : 外一个好处就是隐藏了数据库之间的差异。 : 我用maven的时候,一般说来会创建几个profile, 比如 test, dev, stage, prod. 在 : test profile中, 激活hibernate, 主要用于自动生成test需要的hsqldb in-memory : 数据库。 在dev profile 中,一般说来是localhost mysql. 也激活hibernate, 帮我
|
|
|
a*******n 发帖数: 237 | 21 no and no cache.
【在 s***o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : do you also implement change tracking within your own orm? : : memory
|
s***o 发帖数: 2191 | 22 without change tracking, how do you make persistence of your domain changes?
Recently I had a look on some "micro ORMs" (that's what we call them in .
NET world), and this is one problem I haven't found an answer...
【在 a*******n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : no and no cache.
|
t*******e 发帖数: 684 | 23 正好看到这一块,过来update一下。
Shared Cache in JBoss/Hibernate4.0 - Infinispan, is marketed as a
"Transactional in-memory key/value NoSQL datastore & Data Grid"
里执
【在 t*******e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : cache只对fetch by primary key有用,因为cache的key就是entity的ID, arbitrary : query还是map成SQL执行的。即便整个table都cache了,hibernate根本不懂在cache里执 : 行JPQL或SQL的。
|
a*****a 发帖数: 1429 | 24
memory
That is an interesting statement.
That is funny: Hibernate benefits Maven workflow only
【在 a*******n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 用了n年的hinernate, 包括sharding. 也算半个砖家。 : 对我来说,hinernate的好处不在于object-relation-mapping. 数据库和对象的转换其 : 实很简单,有那么几百行程序就完全够用了。在我最近的一个项目中就自己实现了。 : 对我来说,hibernate的最大的好处是数据库table的自己创建。java类中增加了一个 : field, hibernate就能自动在表中创建列。大大减少了开发人员的工作,提高了效率。 : 在单元测试中,用in-memory数据库的时候更是必不可少。这里也能体现hibernate的另 : 外一个好处就是隐藏了数据库之间的差异。 : 我用maven的时候,一般说来会创建几个profile, 比如 test, dev, stage, prod. 在 : test profile中, 激活hibernate, 主要用于自动生成test需要的hsqldb in-memory : 数据库。 在dev profile 中,一般说来是localhost mysql. 也激活hibernate, 帮我
|
a*****a 发帖数: 1429 | 25
Hibernate won't don what you claimed either.
For same reasons I designed two OR mapping models. Hibernate has a big
performance problem if you have tons data.
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 你低估了当你需要效率并有一定复杂度时ORM有多好用。 : 举个简单例子,一个20个column的user profile table. : 每个column都可能被单独修改,而你又希望只写改动 : 的column。用JDBC你试试?
|
a*******n 发帖数: 237 | 26 not quite sure about the problem you mentioned. the Micro ORM just some
helper classes. for example, orm.insert(Object), orm.update(object, columns.
..), orm.select(class, sql)
changes?
【在 s***o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : without change tracking, how do you make persistence of your domain changes? : Recently I had a look on some "micro ORMs" (that's what we call them in . : NET world), and this is one problem I haven't found an answer...
|
g*****g 发帖数: 34805 | 27 I could be wrong, I haven't been doing hibernate stuff for 3 years.
But I think it does check against your cached copy in memory
and it can do smart query.
【在 a*****a 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : Hibernate won't don what you claimed either. : For same reasons I designed two OR mapping models. Hibernate has a big : performance problem if you have tons data.
|