2009-06-14 45 views
0

第一篇文章在这里...从PHP的Propel去到Java的Hibernate

我发育正常使用PHP和Symfony的波轮与和ActionScript 3(Flex 3的),使用AMF服务。这个周末我正努力创建一个BlazeDS应用程序使用Java休眠,我开始喜欢Java很多!

一些研究,本周末使用Hibernate的同步的Eclipse插件后,创建一个映射类(原谅我的术语),以表看起来相当容易了,我迅速地越来越接近了解这些方面。

但是我想知道的是如何为我的数据库开发一个更全面的体系结构,特别是在查询,结果和迭代方面。让我ellaborate:

如果我有例如作者表,我将创建其映射到表中的作者类,有getter和setter方法等,这部分看起来很标准的条款休眠。另外,我可能需要一个Peer类(比如在Propel for PHP中)来做例如查询,它将返回一个包含Author实例的List /数组。

所以我会(在校而言)以下类别:

作者 - 代表单行getter和setter。

AuthorsPeer - 例如功能如AuthorsPeer :: getAuthorsByCountry('USA');或 - AuthorsPeer :: getRetiredAuthors();AuthorsPeer :: getAuthorsWithSwineFlu(); - ...得到图片。 :) - 返回AuthorsList,因为它的结果...参见下一点。

AuthorsList - 作者与函数的集合/列表迭代GETNEXT()getPrevious()

这是它的意思是休眠的方式,还是我失去了情节?我在这里注意到设计模式,并没有注意到它吗?我是否需要像AuthorsList这样的东西,还是Hibernate提供了一个通用的解决方案。总而言之,处理这些方面的规范是什么。

另外,如果我有一个图书表,这些都与作者的关系,如果我打电话说 作者myAuthor =作者:: getAuthor(primaryId,includeBooks); 可以Hibernate处理返回我可以使用的结果如下: String title = myAuthor.books [0] .title;

我在问什么,查询作者有关书籍表结果Hibernate返回作者与他们的书都嵌套在作者“价值对象”内为我准备好一些迭代突袭?

在此先感谢!

回答

0

大部分问题的答案是肯定的。你应该真正考虑的是如何映射Hibernate中的一对多关系。在你的情况下,作者是“一个”,书籍是很多的。那里描述了Associative mappings。如果您使用带Hibernate的注释(我强烈建议通过XML文件),您可以了解如何执行与注释here的关联。

关于hibernate的伟大之处在于,您不必为管理关系做太多事情。以下是您的Author-Book关系需要的代码片段。

@Entity public class Author { 
    @OneToMany(mappedBy="author") 
    public List<Book> getBooks() { 
     return books; 
    } 
... 
} 

@Entity public class Book { 
    public String getName() { 
     return bookName; 
    } 

    @ManyToOne 
    public Author getAuthor() { 
     return author; 
    } 
    ... 
} 

要想从表中的作者,你可以使用标准API或HQL。我更喜欢Criteria API,因为它符合Java的一般编程习惯(与HQL不同)。但是你的偏好可能不同。


在旁注:您不应该创建一个“AuthorsList”类。 Java的泛型为你做的工作:

List<Author> myAuthors = new ArrayList<Author>(); 

//iterate like so 
for(Author author: myAuthors) { 
    //do something with current author 
} 

//or just grab 1 
Author firstAuthor = myAuthors.get(0); 

Java处理编译时间检查的类型,所以你不必。

+0

谢谢!休眠就是希望! :) – 2009-06-15 17:43:57

0

基本上答案是肯定的,有点。 :)如果您获取一个作者,然后访问书籍集合,Hibernate会为您延迟加载数据。这实际上不是执行此操作的最高性能方式,但对于程序员来说很方便。理想情况下,您希望使用诸如HQL(Hibernate查询语言)或其Criteria API之类的语句来执行查询并“预先获取”书籍集合,以便可以使用单个SQL查询加载所有数据。

http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html

否则,如果你访问具有相关联的说给它500本书籍的作者,休眠可发出针对这当然是慢得令人难以置信的数据库500个+ 1的SQL查询。如果你想了解更多关于这方面的信息,你可以通过谷歌的“n + 1选择问题”来了解它。