旉Q?007-05-11 作者:Patrick Linskey 览ơ数Q? 81 本文关键字:EJB, Persistence, 持久?/a>, EJB3 |
|
几个星期以前Q我?#8220;JPAQ好与坏”Z题主办了一?|上技术交会。它受到了广泛的xQ因此,我没有够的旉在这个时间空档结束时解答所有问题。这里只列出了对其中部分问题的答复。我不断更新这博客文章,量解答其余的问题?/p>
问题QEJB专家团队是如何摆׃务描q符的?
回答Q?/strong>在会话bean和消息驱动bean中,可以通过描述W和注释来控制事务的行ؓ。此外,我们默认的事务属性更改ؓ“REQUIRED”Q这个默认值比以前的?#8220;SUPPORTS”更常用。因此,完全不必Z务方法配|事务行为?/p>
JPA实体仅供本地使用Q重点关注域模型。因此,无法在JPA实体上配|事务性(或远E边界或安全性)。而是必须使用会话bean
façadeQ或消息驱动beanQ,才可以通过EJB协议使用q些实体。通常来说Q这是一件好事,配置安全性、远E处理和事务的粒度应该比持久化数据的
_度_很多。JPA着重关注持久化数据Q以及与EJB的其他部分和Java EE规范集成h照管其他企业x炏V?/p>
问题Q推荐对主键使用“long”q是“Long”Q如果允怋用null作ؓ|会如何Q?/strong> 回答Q?/strong>q实际上取决于您的数据模型。如果您的数据模型允怸键ؓnullQ那么用LongQ如果您的数据模型规定主键列不能为nullQ则使用long更合适。ȝ来说Q我认ؓ对于非复合主键,允许null作ؓ合法值容易生淆,因此我們于用longQ而不是Long?/p>
问题Q您说EJB 2.0不支持承,但是可以在几个不同位|(q程/beanQ用承,只是不在本地使用而已。请解释一下?/strong> 回答Q?/strong>ҎEJB 2.1规范的附录D3Q?/p>
当前的EJB规范未指定组件承的概念?/p>
另一斚wQJPA规范实规定了实体承的概念。我们已l处理了EJB 2.1规范中指出的各种问题和复杂性,现在允许完全的多态查询和兌?/p>
问题QBEA计划什么时候支?发布EJB3Q? WebLogic Server 10 Technology Preview 是完全符合规范的Java EE 5应用服务器。它包括完整的EJB3支持。WebLogic Server 10大概于三月下旬发布?/p>
此外Q?a target="_blank">Kodo 是完全符合规范的生qAJPA实现Qƈ且已l发布?/p>
问题QJPA是否支持l合主键Q? 回答Q?/strong>JPA支持自然ID和组合IDQ以及数据库指派或实现指z数字倹{?/p>
问题Q是否存在Spring模板Q像JDBC模板一样可以在容器外部使用Q? 回答Q?/strong>是的QSpring 2有JPA模板。但是,Spring
2可以对Q何标记着@Repository的bean执行JPA异常转译。因此,ȝ来说Q对于新的应用程序,最好直接用JPA
APIQ而不是另一个模板层。对于用模板和正在q移到JPA的现有应用程序来_使用模板Ҏ比较合理?/p>
此外Q可以像在Java EE服务器中一样将JPA的持久化单元部v到SpringQSpring对JPA规范中指出的EntityManager注入和查找服从容器规则?/p>
问题QJPA是否支持JDK1.4Q?/strong> 回答Q?/strong>JPA需要Java 5或更新版本?/p>
问题Q用范围查询时Q它是否也会q回l果LQ例如,q回538结果中?-10)Q?/strong> 回答Q?/strong>不,要想获得LQ必d出另外一个查询。通用模式是,在第一ơ执行搜索时获得LQ然后通过面览l果Q将L存储到方便的位置Q会话状态、cookie{)Q?/p>
问题Q具有JPA包装器的Hibernate是不是一UEJB3实现Q?/strong> 回答Q?/strong>JPA规范是完整的EJB3规范的子集,因此JPA实现本n不是完整的EJB3实现。我不了解RedHat的EJB3实现的情况如何。但QHibernate是JPA实现?/p>
问题Q与Hibernate相比QJPA是不是更好? 回答Q?/strong>JPA是规范,而Hibernate是实现。因此,q是不同事物的比较。可以肯定,使用标准API比用专有API有更多优势,但不存在真正的劣ѝ?/p>
问题Q是不是不再需要学习和使用HibernateQ?/strong> 回答Q?/strong>规范团队关于JPA
1的目标之一是制定一个可以由很多供应商实现的APIQƈ且开发h员可以编码来实现该APIQ而不是用私有供应商Ҏ的API。我们已成功实现q个?
标,因此您只需使用供应商特有的API来获得JPA规范没有解决但您的应用程序中需要的功能。我的徏议是可能地使用JPA
APIQ但是当需要供应商公开但是规范中没有提供的功能Ӟ则用供应商Ҏ的API?/p>
例如QOpenJPA提供了保存点功能Q但JPA规范没有。因此,希望使用保存点的OpenJPA开发h员应该对代码的大部分内容使用JPA规范Q而借助OpenJPAEntityManager来设|和理保存炏V?/p>
问题Q规范是否解决了~存问题Q?/strong> 回答Q?/strong>JPA规范没有解决二~存问题QEntityManagerFactory-U)Q但是提供了实现该缓存必遵守的一些数据锁定和一致性规则,即在启用缓存时也是如此?/p>
有少量与~存有关的主题可能会在将来的JPA规范版本中解冻I但是大多数缓存主题不必指定规则,q样Q不同的供应商就可以L地完成不同的工作。此处增加的最重要的内Ҏ一些基本缓存控制APIQ如回收某些对象IDQ或一些经常访问的ID固定到缓存中?/p>
问题Q既然实体管理器承担了所有繁重的工作负蝲Q那么会话beanq有什么h| 回答Q?/strong>EntityManager负责域对象模型和数据库之间的交互Q但是仍然在会话中实现安全性、事务控制?
q程处理、有状态的临时数据存储Q而操作单元编E模型无法解决以上问题。会话beanq是部v单元和公用服务边界。因此,会话bean是定义所有业务代?
的地斏V换而言之,会话bean是EJB容器x的,而JPA实现是在会话bean中用的?/p>
当然Q您q可以直接从servlet或JSP或其他Q何可以用Java 5的地方用JPA。但是这L话,您就必须理自己的事务、处理自q集群服务故障转移、管理自q服务重部|等?/p>
原文出处Q?/strong>http://jroller.com/page/pcl?entry=jpa_the_good_the_bad 下面是一l关?a >“JPAQ好与坏”|上技术交会 的更多问{。尽仍有少量问题尚未解{,但是应该很快׃l出?/p>
问题Q相对于EJB2来说QEJB3可以处理多少个ƈ发事务? 回答Q?/strong>从纯会话bean的观ҎԌ臛_在WebLogic
Server中,q发事务的数目没有什么差别。也是Q如果将您的应用E序从EJB2会话bean转换到EJB3会话beanQ但是完全没有修Ҏ久化?
Ӟ可能不会发现重大差别。这是因为EJB3规范对会话bean部分的大多数更改着重实现编E模型的改进?/p>
从实体bean的观ҎԌ我认为对于大多数应用E序QWebLogic Server的EJB 2.1和JPA支持的ƈ发事务数目相同。您可能发现JPA对于非主键的查询来说Q可伸羃性更高。一旦开始钻研Kodo?锁定l?/a> 之类的功能,则对于固定的域模型,可以从基于JPA的系l中获得更多q发事务?/p>
问题Q如何ؓAquaLogic DSP应用JPAQ?/strong> 回答Q?/strong>AquaLogic
DSP着重关注对数据的多重存储访问,q将数据作ؓ数据服务提供Q通常作ؓXML或SDO呈现q些数据。JPA规范着重关注与数据存储交互的Java
API。可以设惻IJPAl定到AquaLogic DSPQ或SDOl定到Kodo产品QBEA的JPA实现Q?/p>
问题QJPA是否支持惰性加载? 回答Q?/strong>是的。默认情况下QCollection和Mapcd的字D|惰性检索的Q而其他所有字D都是主动获取的。通过在字D늚持久化注解中指明“fetch”属性,可以Z各个字段静态地控制该行为?/p>
问题Q什么是实现q程的最佳位|,例如Q检查许多用户及其帐P在银行应用程序中Q以付给利息Q是在数据库的存储过E中实现Q还是在EJB中用JPA实现Q还是同时用这两种方式Q?/strong> 回答Q?/strong>Ҏ我的l验Q这实际上取决于l织因素Q而不是其他因素。一些工作室更喜Ƣ在存储q程中进行大量编码,而另一些则喜欢在Java中实现其业务逻辑。每U方法各有优势和代h?/p>
管如此Q还是有一些问题可促他们优先考虑其中的一U环境。在您的例子中,在数据库中执行大量计可能比数据加载到内存中更快,因此使用存储q?
E可能比较合理。另一斚wQ数据库承担q么多负载将对该应用E序的用户生负面媄响,因此最好付Z定代仯|络拉出q些数据Q以便将该数据库用作严格?
存储pȝQ而不是计引擎。或者,如果应用E序的其余部分主要用JPAQ则适用的话Q可能希望用JPQL的大扚w更新功能来进行更新?/p>
问题Q如果不先将数据加蝲到内存中Q是否可以执行大扚w更新Q?/strong> 回答Q?/strong>是的Q可以通过JPQL执行大批量更新和大批量删除: UPDATE Employee e SET e.salary = e.salary * 1.1 WHERE e.salary < 100000 问题Q你们对Kodo JDO有什么规划?JPA是否会通过实现JDO的所有功能而将其取代?如果是的话,是否存在M旉表?如果不是Q你们会不会l箋U极地开发JDOQ?/strong> 回答Q?/strong>BEA仍然完全忠于JDO。从规范的观Ҏ看,我认一D|间之后,JPA包含当前的JDO规范中越来越多的功能。但是,我不了解Sun对JDO和JPA之间的融合工作有什么规划?/p>
问题Q什么是持久化单元? 回答Q?/strong>持久化单元是cd配置讄的集合,可以Ҏ该集合创建EntityManagerFactory。它?persistence.xml 文g中作Z个条目出现?/p>
问题Q如何在WebLogic 9.2中测试JPA 回答Q?/strong>现在可以在WebLogic
9.2中用OpenJPA或Kodo。该服务器不执行会话bean持久化单元注入,但是?0.0服务器中可以q么作,q且?.2中,没有M
Kodo控制台集成。但是除了引导注入问题之外,应该能够在WebLogic 9.2中成功地使用JPAQ包括参与托事务?/p>
问题QJDBCq接对应于JPA中的什么概念? 回答Q?/strong>JPA EntityManager大致相当于JDBCq接Q而JPA
EntityManagerFactory从概念上cM于JDBC数据源。JPA EntityTransactionQ仅在JTA /
appserver上下文以外可用)相当于JDBCq接的事务控制API?/p>
在OpenJPA中,EntityManager在其生命周期中可能用多个不同的JDBCq接。请参阅 openjpa.ConnectionRetainMode 属性的文档了解详细信息?/p>
问题Q关于fetchcdQ如果默认是dQeagerQ加载,则提供程序可能忽略惰性(lazyQ加载指令。因此,即ɞ字D设|ؓ惰性,也可能会加蝲不必要的数据。将来的规范会不会将其修改ؓ必须与fecthcd一_q会涉及C么问题? 回答Q?/strong>通常QOpenJPA永远不会忽略用户配置的FetchMode。这是提C不是规则,因ؓ惰性加载实?
上是调优q程中一关注事,永远都不应该对应用程序生行为性的影响*。JPA规范力图避免要求使用M明确的性能调优{略Q因Z同的|络拓扑l构?
数据存储pȝ和应用程序行为需要不同的调优x?/p>
例如QOpenJPA允许在运行时 动态控?/a> fetch配置。这意味着Q它可能静态地配置对象模型Q某些字段q行惰性加载,然后动态地其中一个字D|加到当前的fetch计划。这导致OpenJPAq反静态定义的惰性设|?/p>
在当天结束时Q如果实现对数据加蝲执行错误的操作,您应能够非常L地评估其他实玎ͼ通过威胁转移到另一个实玎ͼ以至获得所需的功能。这是让大量供应商采用JPA规范的重大优势之一?/p>
*当然Q如果您依靠惰性加载设|来防止加蝲某些数据Q以免后来传输到不同的层Q也是Z数据安全性)Q那么惰性加载存在重要的行ؓ性媄响。在OpenJPA中,可以使用 fetchl?/a> 控制通过늼发送数据图时确切地分离哪些数据?/p>
问题Q在q行时更改fetch模式容不ҎQ?/strong> 回答Q?/strong>JPA规范没有为此提供M工具。OpenJPA通过 fetch规划 接口提供了对fetch特征的详l控制。JPQL?#8220;JOIN FETCH”l构也可以用于限制主动fetch提示?/p>
问题Q用乐观锁定时Q@Version注释仅支持int字段吗,它可以是datetime吗? 回答Q?/strong>ҎJPA的要求,@Version可以对int、long、short、Integer、Short、Long和Timestampcd的字D用。(JPA规范的第9.1.17节Q?/p>
问题Q在JPA可以调用存储q程吗? 回答Q?/strong>JPA规范仅要求支持SELECT
SQL语句Q通过EntityManager.createNativeQuery()调用Q或@NamedNativeQuery注解或named-
native-query XML元素Q。但是,我认为大多数实现也多支持以相同方式调用存储q程?/p>
问题Q在EJB3中,更新实体bean的单个字D?列会D更新该DB行中的所有字D?列,q是仅更新该DB行中更改的列Q?/strong> 回答Q?/strong>该行为取决于实现。OpenJPA只更新被修改字D对应的列。但是,我们可能在某些位|添加update-all-columns选项。请参阅 OPENJPA-38?/p>
问题QEJB3.0如何替换EJB2.0中的ejbLoad()、ejbStore()之类的回调方法? 回答Q?/strong>JPA规范提供了一些可以随意(单个Q实现的 回调Ҏ?/p>
问题QEJB3.0如何替换EJB2.0 CMP和BMPQ?/strong> 回答Q?/strong>EJB3 JPA规范对EJB2 CMP提供了功能完善的替换。JPA规范没有解决bean理的持久化Q如果您希望实现自己的持久化Q应该l用BMPQ或者最好用会话bean façadeq行自定义持久化?/p>
问题Q命名查询可以位于JPA实体以外吗?像在会话bean或帮助类中那P 回答Q?/strong>JPA实现仅扫描实体类Q和映射类以及嵌入c)来查扑֑名查询。我希望来的JPA规范版本提供一U方式,用于命名查询限制到一个类对象中,到那个时候,可以认够在M位置定义命名查询?/p>
可以在orm.xml文g中定义命名查询,然后使您的持久化单元指向该orm.xml文gQJPA规范允许Q意数目的orm.xml文g合ƈC赗?/p>
问题QJPQL支持多数据库查询吗? 回答Q?/strong>JPA规范q不要求实现必须只用单个数据库Q甚臛_现必M用关pL据库Q。因此实现可以随意提供对多个数据库的讉K。但是,据我所知,当前的JPA实现都没有这么作Q除非是通过数据库方的工作来实现多数据库查询?/p>
问题Q在JPQL中,SELECT子句可以从多个实体中拉出数据吗? 回答Q?/strong>是的。JPQL语言允许查询聚合和投影。因此以下语句是有效的JPQL语句Q?/p>
select p.name, p.contactInfo.phoneNumber from Person p select p.address.state, avg(p.salary) from Person p group by p.address.state 问题QJPA规范是否解决了缓存问题? 回答Q?/strong>JPA规范仅解决给定EntityManager相关对象的事务工作集的行为。它UC?#8220;持久化上下文”。从某些斚w来讲Q这是一个缓存,但通常是ؓ了保持事务一致性,而不是ؓ了性能的原因?/p>
JPA规范没有解决性能~存Q如OpenJPA?数据~存 ?查询~存。但是规范中的规则对q类性能~存暗示了某些行为约束?/p>
总而言之,JPA规范主要x的仅是API的行为方面,而由各种实现完成大多数性能有关的调优。尽如此,所有可靠的实现都应该拥有某U数据缓存,以作为选择?/p>
问题QWebLogic Server 9.0仍然仅支持EJB2.0Q是吗? 回答Q?/strong>正确。WebLogic Server 10.0是完全支持EJB3规范的第一ƾBEA产品。在WebLogic Server 9中可以通过BEA Kodo产品来用JPA?/p>
问题Q关于JPA的推荐教E是什么? 回答Q?/strong>Kodo文档 中提供了许多JPA教程?/p>
问题Q?strong>是否存在M方式Q用于跨所有实体表配置表前~Q?/strong> 回答QJPA规范中没有提供这U方式,在OpenJPA中,可以通过创徏扩展?DBDictionary q写getValidTableName()Ҏ来实现该功能?/p>
问题Q是否可能通过~程修改ORMl定Q如重写orm.xml中指定的一些ORM配置Q? 回答Q?/strong>不是通过JPA规范实现的。OpenJPA提供了一些方法,用于以编E的方式创徏映射信息Qƈ且该规范实提供了一U方法,用于在创建EntityManagerӞ特定于供应商的重写内容传递给persistence.xml中的数据?/p>
问题Q我们正在构Z个大型应用程序,其中?50个对象坚持JPA规范。当我们使用Kodo
4.1持久化这些对象时Q它的SELECT查询最l将每个查询的大多数表连接v来,q得Kodo相当慢。TopLink
Essentials实现仅连接少量的相关表。您对解册问题有什么徏议? 回答Q?/strong>我认?#8220;一对一”?#8220;多对一”字段cd的不同默认行为有兟뀂我猜想Q如果您明确地告知Kodo?#8220;一
对一”?#8220;多对一”字段cd执行惰性加载,׃很清楚。如果这不v作用Q或者如果您希望获得更多帮助来分析您的具体用例,请发送电子邮件到
plinskey@bea.com?/p>
问题Q开发h员可以用JPA来控制表的连接方式吗Q?/strong> 回答Q?/strong>不能直接控制Qƈ且不是通过规范实现的。但是,大多数实现可能提供了一些方式来影响如何q接。有关OpenJPA的详l信息,请参阅关?dfetching 的文档?/p>
问题Q在何处指定数据源? 回答Q?/strong>数据源通常是在persistence.xml中指定的Q根据您的实现和应用服务器的默认行ؓQ可能需要ؓjta-data-source?或non-jta-data-source讄提供倹{?/p>
问题QJPA规范是否计划在将来支持里E碑或双时态链Qbi-temporalQ? 回答Q?/strong>据我所知,JPA规范团队目前没有计划提供M时态功能?/p>
问题Q如果抛Z观锁定异常,可以了解哪些列发生冲H吗 回答Q?/strong>不可以。您可以了解哪些实例p|Q但不是字段。给定失败的实例Q很Ҏ从数据库中加载新|q进行比较?/p>
原文出处Q?/strong>http://jroller.com/page/pcl?entry=more_webinar_questions_and_answersif (isFirstPage()) { // this is the first time we're executing this query
Query q = em.createQuery("SELECT COUNT(p) FROM Product p WHERE ...");
long count = ((Long) q.getSingleResult()).longValue();
// store count somewhere stateful
}
Query q = em.createQuery("SELECT p FROM Product p WHERE ...");
q.setFirstResult(page * PAGE_SIZE); // page is stored somewhere stateful
q.setMaxResults(PAGE_SIZE);
关于|上技术交会的更多问{?/span>
旉Q?007-05-13
作者:Patrick Linskey
览ơ数Q?
20
本文关键字:EJB, Persistence, 持久?/a>, EJB3
文章工具
推荐l朋?/a>
打印文章
]]>