如何外化Hibernate实体?

时间:2011-07-05 18:44:22

标签: hibernate spring jar entity external

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

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

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

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

以下是问题:

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

  2. 在我的外部JAR中,persistence.xml的最小值是多少?例如,主项目已经配置了hibernate方言,那么我可以将其留在外部JAR的persistence.xml吗?

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

  4. 我试过在这个网站上搜索,但还没有发现任何类似的东西来帮助我。如果这是一个重复的帖子,或者是一个愚蠢明显的问题或其他什么,请道歉。

    提前致谢:)

    编辑:

    好的,所以看起来我最终需要知道的是,假设我已经在我的类路径中包含"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>
    

1 个答案:

答案 0 :(得分:0)

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

Hibernate不关心持久化实体类的位置。 他们必须在类路径中, 就这样。 他们是否合二为一, 二, 如果所有这些罐都在类路径中,则三个罐子无关紧要。

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

如果共享类的完全限定名是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