我正在尝试使用org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy
我的Spring项目,但我不确定如何使用它或者它是否正是我正在寻找的.我意识到它可以帮助我的DAO使用简单的JDO PersistenceManagerFactory
.另一个问题是:如果代理没有正确完成会发生什么?我还可以使用它来访问我的工厂来创建一个事务感知持久性管理器吗?如果工厂管理的对象是单例,这会改变吗?为什么不直接访问PersistenceManagerFactory?也许PersistenceManagerFactoryUtils.getPersistenceManager
更适合我的需求?可以getObject
返回null吗?
我熟悉ORM作为一个概念,几年前我甚至将nHibernate用于.NET项目; 但是,我没有跟上Java中的ORM主题,也没有机会使用这些工具.
但是,现在我可能有机会开始为我们的某个应用程序使用一些ORM工具,以试图摆脱一系列遗留Web服务.
我很难说出JPA规范之间的差异,你对Hibernate库本身的看法,以及JDO提供的内容.
所以,我知道这个问题有点开放,但我希望得到一些意见:
我想用Struts2在Google App Engine上开发我的项目.对于数据库,我有两个选项JPA和JDO.请问各位建议我吗?两者对我来说都是新的,我需要学习它们.所以我会在你的回复后专注于一个.
谢谢.
为将在Google AppEngine上运行的Grails应用程序选择JDO或JPA的优缺点
数据访问对象(DAO)是一种常见的设计模式,由Sun推荐.但最早的Java DAO示例直接与关系数据库进行交互 - 它们本质上是做对象关系映射(ORM).如今,我看到DAO在成熟的ORM框架之上,如JDO和Hibernate,我想知道这是不是一个好主意.
我正在使用JDO作为持久层开发Web服务,并且正在考虑是否引入DAO.我在处理包含其他对象映射的特定类时遇到了问题:
public class Book {
// Book description in various languages, indexed by ISO language codes
private Map<String,BookDescription> descriptions;
}
Run Code Online (Sandbox Code Playgroud)
JDO足够聪明,可以将其映射到"BOOKS"和"BOOKDESCRIPTIONS"表之间的外键约束.它透明地加载BookDescription对象(我相信使用延迟加载),并在Book对象持久化时保留它们.
如果我要引入一个"数据访问层"并编写一个像BookDao这样的类,并将所有JDO代码封装在其中,那么这个JDO对子对象的透明加载不会绕过数据访问层吗?为了保持一致性,不应该通过一些BookDescriptionDao对象(或BookDao.loadDescription方法)加载和保存所有BookDescription对象吗?然而,以这种方式进行重构将使得模型的操作变得不必要地复杂化.
所以我的问题是,在业务层中直接调用JDO(或Hibernate,或者你想要的任何ORM)有什么问题?它的语法已经非常简洁,并且与数据存储区无关.如果有的话,将它封装在数据访问对象中有什么好处?
我在app引擎上使用JDO 2.3.我使用Master/Slave数据存储区进行本地测试,最近切换到使用HRD数据存储区进行本地测试,我的部分应用程序正在破坏(这是预期的).正在破坏的应用程序的一部分是快速发送大量写入的地方 - 这是因为1秒限制的事情,它失败了并发修改异常.
好吧,所以这也是预料之中的,所以我让浏览器在失败后再次重试写入(可能不是最好的黑客,但我只是想让它快速运行).
但是一件奇怪的事情正在发生.即使提交阶段完成且请求返回我的成功代码,一些应该成功的写入(不会获得并发修改异常的写入)也会失败.我可以从日志中看到重试的请求工作正常,但是我猜这些似乎在第一次尝试时提交的其他请求从未"应用".但是从我读到的关于Apply阶段的内容来看,再次写入同一个实体应该强制应用......但事实并非如此.
代码如下.有些事情需要注意:
相关代码(这是简化版):
PersistenceManager pm = PMF.getManager();
Transaction tx = pm.currentTransaction();
String responsetext = "";
try {
tx.begin();
// I have extra calls to "makePersistent" because I found that relying
// on pm.close didn't always write the objects to cache, maybe that
// was only a DataNucleus 1.x issue though
Key userkey = obtainUserKeyFromCookie();
User u = pm.getObjectById(User.class, userkey);
pm.makePersistent(u); // to make sure it gets cached for next …
Run Code Online (Sandbox Code Playgroud) 我刚开始学习Google Web Toolkit并完成了Stock Watcher教程应用程序的编写工作.
我想正确的,如果一个人想坚持业务对象(如股票)使用JDO并将其发送从客户端来回/ 通过RPC那么就必须为该对象创建两个单独的类:一是与JDO注解用于在服务器上保留它以及另一个可序列化并在RPC上使用的服务器?
我注意到Stock Watcher有单独的类,我可以理解为什么:
我只是想确保我正确地理解这一点.我不想创建我想要在RPC上使用的所有业务对象类的两个版本,如果我不需要的话.
想在Google App Engine上开发我的项目.我想使用google big table作为数据库.对于数据库,我有两个选项JPA和JDO.请问各位建议我吗?两者对我来说都是新的,我需要学习它们.所以我会在你的回复后专注于一个.
有四个高级API可以访问Cassandra,我没有时间尝试它们.所以我希望找到一个可以帮助我选择合适人选的人.
我会写下我对他们的发现:
优点:
缺点:
优点:
缺点:
优点:
缺点:
优点:
缺点:
由于我对RDMS,Hibernate,JPA,Spring以及对EJB不再那么新闻充满信心,我的第一印象是,去kundera本来是正确的选择.但在阅读了一些有关JPO,DataNucleus的帖子后,我不再确定了.对于DataNucleus,学习曲线应该是陡峭的(对于经验丰富的JPA开发人员?),我不确定,我是否应该去实现它.
我主要担心的是插件的状态.还有JDO和Datanucleus-Cassandra-Plugin的论坛支持/帮助,因为据我所知,它并没有广泛传播.
有人在那里,谁有经验,有一些framworks已经可以给我一个提示?也许混合策略也是有意义的.如果(如果存在的话)JDO不灵活/足够/不足以满足我的需求,那么回归到一个更容易的pelops或hector的API?这可能吗?是否有类似于JPA的方法来获取SQL连接和获取/放置数据?
在阅读了一下之后,我发现了以下附加信息:
Datanucleus-Cassandra-Plugin基于pelops,也可以访问以获得更大的灵活性,更高的性能(?),这应该用于具有大量数据的列族,JDO/JPA访问应仅用于"管理"数据,性能不是那么重要,数据量不是很大.
对于hector或pelops来说,这仍然是个问题.
pelops为它后来的Datanucleus-Cassandra-Plugin可扩展性,或者hector,它对节点hanldling有更多的支持.
我正在使用Eclipse 3.7(OSGI),我可以进行手动增强(使用Datanucleus Eclipse插件和datanucleus-enhancer-2.1.0版本作为插件依赖项导入)
我现在正在尝试使用API类增强功能:http://www.datanucleus.org/products/accessplatform/jpa/enhancer.html#api
使用ASM 3.1在类路径和此代码中:
DataNucleusEnhancer enhancer=new DataNucleusEnhancer("JDO","ASM");
enhancer.setVerbose(true);
enhancer.addClasses(...);
enhancer.enhance();
Run Code Online (Sandbox Code Playgroud)
我明白了:
You have selected to use ClassEnhancer "ASM" yet the JAR for that enhancer does not seem to be in the CLASSPATH!
org.datanucleus.enhancer.NucleusEnhanceException: You have selected to use ClassEnhancer "ASM" yet the JAR for that enhancer does not seem to be in the CLASSPATH!
at org.datanucleus.enhancer.DataNucleusEnhancer.init(DataNucleusEnhancer.java:224)
at org.datanucleus.enhancer.DataNucleusEnhancer.addClasses(DataNucleusEnhancer.java:406)
Run Code Online (Sandbox Code Playgroud)
使用教程中建议的代码:
JDOEnhancer enhancer = JDOHelper.getEnhancer();
enhancer.setVerbose(true);
enhancer.addClasses(...);
enhancer.enhance();
Run Code Online (Sandbox Code Playgroud)
我明白了:
javax.jdo.JDOFatalUserException: There are 0 services entries for the …
Run Code Online (Sandbox Code Playgroud)