【问题标题】:How to externalize Hibernate Entities?如何外部化 Hibernate 实体?
【发布时间】:2011-09-29 01:31:58
【问题描述】:

我正在开发一个基于 Java/Spring/Hibernate 的 Web 应用程序,该应用程序是在 Eclipse 中开发的。

这个网络应用实际上是两个不同的项目,它们复制了几个 Hibernate 实体类,以及它们各自的 Hibernate 存储库类。显然,将重复的代码移到外部 JAR 文件或其他文件中会很好。

从 Hibernate 文档中,我知道我应该将实体类放在一个包含 persistence.xml 文件的新 JAVA 项目中。我也知道我可以将这个项目导出到一个 JAR 中,并将它包含在我的主要项目的类路径中。此外,我知道我应该在我的主项目中从我的hibernate.cfg.xml 引用这个 JAR。

由于某种原因,我现在正在进行的项目似乎并不那么简单。

以下是问题:

  1. 在我保存共享代码的外部项目中,我也可以包含 Hibernate Repository 类吗?如果确实需要,应该如何在persistence.xml 中注明?

  2. 在我的外部 JAR 中,persistence.xml 可以最小到多少?例如,主项目已经配置了休眠方言,那么我可以将其从外部 JAR 的persistence.xml 中删除吗?

  3. 从 Hibernate 文档中,我知道我可以使用 hibernate.cfg.xml 中的 <jar-file> 标记来引用我的外部 JAR 文件。那么如果我的项目没有hibernate.cfg.xml 怎么办?我们有一个用于 Spring 的配置 xml,它为 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 提供了一个 annotatedClasses 属性。我没有太多运气找到使用AnnotationSessionFactoryBean 引用外部 JAR 文件的示例。

我试过在这个网站上四处搜索,但还没有找到任何类似的东西来帮助我。如果这是一个重复的帖子,或者一个愚蠢的明显问题或其他什么,我们深表歉意。

提前致谢:)

编辑:

好吧,看来我最终需要知道的是,假设我在我的类路径中包含了"MY_TEST.jar",并进一步假设"MY_TEST.jar" 有一个带注释的Hibernate 类:src.shared.myEntity.java

我将如何使用下面的 Spring 配置摘录来引用这个实体类? (无论我尝试什么,都会收到IllegalArgumentException: Cannot find class

<bean id="my.postgres.sessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

    <property name="dataSource"
        ref="my.postgres.dataSource" />

    <property name="annotatedClasses">
      <list>
        <value>src.app.EntityA</value>
        <value>src.app.EntityB</value>
      </list>
    </property>
    .........
</bean>

【问题讨论】:

    标签: hibernate spring jar entity external


    【解决方案1】:

    Hibernate 没有存储库的概念。 春天会。

    Hibernate 不关心持久实体类的位置。 它们必须在类路径中, 就这样。 无论是合二为一, 二, 如果所有这些 jar 都在类路径中,或者三个 jar 都没有关系。

    根据需要组织项目,并确保类路径中没有两个不同的休眠配置文件。 我会使用一个项目来保存所有公共实体以及它们相关的存储库,并让主项目定义休眠配置文件。

    如果共享类完全限定名是 src.shared.myEntity, 那么 spring 配置应该有以下几行:

    <property name="annotatedClasses">
      <list>
        ...
        <value>src.shared.myEntity</value>
      </list>
    </property>
    

    您的措辞令人困惑, 所以我会检查我认为显而易见的, 但也许不是。 一个类的完全限定名由它的完整包名组成,后跟类名, 没有 .class 或 .java 扩展名。 jar 必须包含 .class 文件, 不是 .java 文件。 jar 中目录的层次结构必须精确映射包的层次结构。 因此,如果您的实体如下所示:

    package src.shared;
    
    @Entity
    public class myEntity {
        // ...
    }
    

    罐子应该有, 从根本上说, src 目录, 包含shared 目录, 包含myEntity.class 文件。

    PS:将src 作为根包名真的很奇怪。 为什么不遵守约定:com.yourcompany.yourproject...?

    PPS:类名应始终以大写字母开头: MyEntity 而不是 myEntity

    【讨论】:

    • 您好,感谢您的快速回复!对不起,我误会了存储库的事情。我的类路径中有我的外部 jar,但是在我的 Spring 配置中使用 AnnotationSessionFactoryBean 属性引用它时遇到了麻烦。同样,Hibernate 文档给出了一个清晰的示例,说明如何使用 hibernate.cfg.xml 文件完成此操作,但最初的项目架构师决定不包含此内容,而是通过 Spring 的配置来配置所有内容。一切都在编译,但是spring找不到我的外部实体类
    • 然后向我们展示您遇到问题的 spring 配置,并告诉我们发生了哪个异常(堆栈跟踪)。但是 spring 也不关心罐子。如果某个类在类路径中,它会找到它。
    • 哦,对不起,我不是故意的。我正在查看的实体和包结构确实遵循惯例......显然我打字失败:) 另外,这很有趣,根据你发布的内容,我所拥有的应该可以正常工作。我确实按照您的建议进行了所有设置,并且像您所说的那样从我的主项目的 spring 配置文件中引用了我的 JAR 文件中的实体。我一定还是错过了什么……嗯……
    • 嘿,顺便说一句,感谢您抽出时间来帮助我!
    猜你喜欢
    • 2013-04-18
    • 2017-02-03
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2011-09-12
    • 2011-11-20
    相关资源
    最近更新 更多