我正在开发一个基于Java / Spring / Hibernate的Web应用程序,它是在Eclipse中开发的。
这个Web应用程序实际上是两个不同的项目,它们复制了几个Hibernate实体类,以及它们各自的Hibernate存储库类。显然,获取重复的代码并将其移动到外部JAR文件或其他内容会很好。
从Hibernate文档中,我知道我应该将实体类放在包含persistence.xml
文件的新JAVA项目中。我也知道我可以将此项目导出到JAR,并将其包含在主项目的类路径中。此外,我知道我应该在我的主项目中从hibernate.cfg.xml
引用这个JAR。
出于某种原因,我现在正在进行的项目似乎并不那么简单。
以下是问题:
在包含共享代码的外部项目中,我是否也可以包含Hibernate Repository类?如果确实需要的话,应该如何在persistence.xml
中注明这一点?
在我的外部JAR中,persistence.xml
的最小值是多少?例如,主项目已经配置了hibernate方言,那么我可以将其留在外部JAR的persistence.xml
吗?
从Hibernate文档中,我知道我可以使用<jar-file>
中的hibernate.cfg.xml
标记引用我的外部JAR文件。那么如果我的项目没有hibernate.cfg.xml
怎么办?我们有一个Spring的配置xml,它为annotatedClasses
提供了org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
属性。我很幸运找到了使用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>
答案 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
。