【问题标题】:Going from PHP Propel to Java Hibernate从 PHP Propel 到 Java Hibernate
【发布时间】:2009-06-14 21:54:53
【问题描述】:

第一次发帖...

我通常使用 PHP 和 Symfony 以及 Propel 和 ActionScript 3 (Flex 3) 进行开发,并使用 AMF 服务。这个周末我正在尝试使用 JavaHibernate 创建一个 BlazeDS 应用程序,我开始非常喜欢 Java! !!

在本周末进行一些研究并使用 Eclipse 的 Hibernate Synchronizer 插件后,创建映射到表的类(请原谅我的术语)似乎相当容易,我很快就更接近理解这些方面了。

然而,我想知道的是如何为我的数据库开发更全面的架构,特别是在查询、结果和迭代方面。让我详细说明:

例如,如果我有一个 authors 表,我将创建一个映射到该表的 Author 类,其中包含 getter 和 setter 等。这部分看起来在 Hibernate 方面非常标准。

此外,我可能需要一个 Peer 类(例如在 Propel for PHP 中)来执行查询,该类将返回一个包含 Author 实例的 List/Array。

所以我会(在纠正下说话)以下课程:

作者 - 表示带有 getter 和 setter 的单行。

作者同行 - 例如具有 AuthorsPeer::getAuthorsByCountry('USA'); 或 - AuthorsPeer::getRetiredAuthors();AuthorsPeer::getAuthorsWithSwineFlu(); - ... 得到图片。 :) - 它返回一个 AuthorsList 作为结果...见下一点。

作者列表 - 作者的集合/列表,具有用于迭代 getNext()getPrevious() 等的函数。

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

另外,如果我有一个 Books 表,这些都与 Authors 相关,如果我打电话说 作者 myAuthor = Authors::getAuthor(primaryId, includeBooks); Hibernate 可以处理返回给我的结果,我可以使用如下: 字符串标题 = myAuthor.books[0].title;

我要问的是,对与 Books 表相关的 Authors 的查询是否会导致 Hibernate 返回 Authors,他们的 Books 都嵌套在 Authors“值对象”中,准备好进行一些迭代?

提前致谢!

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您的大部分问题的答案都是肯定的。您真正应该研究的是如何在 Hibernate 中映射一对多关系。在您的情况下,作者是“一个”,而书籍是很多。 Associative mappings 在那里描述。如果您在 Hibernate 中使用 Annotations(我强烈推荐在 XML 文件上使用),您可以了解如何与注解 here 进行关联。

    hibernate 的伟大之处在于您无需做太多事情来管理关系。以下是您的 Author-Book 关系所需的代码 sn-p。

    @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;
        }
        ...
    }
    

    要从表中获取作者,您可以使用 Criteria 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 会根据类型处理编译时检查,因此您不必这样做。

    【讨论】:

    • 谢谢! Hibernate 是 shizness! :)
    【解决方案2】:

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

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

    否则,如果您访问的 Author 关联了 500 本书,Hibernate 可能会针对数据库发出 500 + 1 个 SQL 查询,这当然非常慢。如果您想了解更多相关信息,可以谷歌“n + 1 选择问题”,因为它通常被称为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多