我有一个相当大的(新)项目,其中我们用JPA映射注释了许多域类。现在是实施许多命名查询的时候了 - 一些实体可能有多达15-20个命名查询。我认为在注释中编写这些命名的查询会混淆源文件,因此我正在考虑将这些文件放在XML映射文件中。混合JPA注释和XML配置
这可能吗?
重要的是,这是合理的吗?
有没有更好的方法?
这是如何完成的?
我有一个相当大的(新)项目,其中我们用JPA映射注释了许多域类。现在是实施许多命名查询的时候了 - 一些实体可能有多达15-20个命名查询。我认为在注释中编写这些命名的查询会混淆源文件,因此我正在考虑将这些文件放在XML映射文件中。混合JPA注释和XML配置
这可能吗?
重要的是,这是合理的吗?
有没有更好的方法?
这是如何完成的?
这可能吗?
是的,但趋势更集中化,而不是相反。
更重要的是,这是否合理?
我我不是通过在我的实体类文件的顶部具有注释块恼火。其实,我喜欢有我的问题,我认为他们属于:实体旁边。 我也喜欢编写时间检查(关于实体名称,属性)和我在Java代码中编写查询时得到的代码完成(不知道我的IDE会用xml映射来做这件事)。换句话说,我不觉得需要,也不想外化查询。
有没有更好的方法?
我相信使用注释是最佳实践。
这是怎么完成的?
的建议是使用XML映射文件仅适用于那些具体特定数据库(当然,我忽略的遗留代码明显的例子,你不能注释)原生SQL语句。换句话说,请使用注释,但尽可能使代码免受特定于供应商的内容的影响。
JPA 1。0规范共同领导Mike Keith涵盖了与OTN专栏“无论注释”中的XML元数据策略(XML策略)和源内元数据策略(注释策略)相关的许多权衡。可悲的是,我找不到他的出版物的非死链接。也许你会更幸运,在这种情况下,阅读它。
这是可能的,但我不认为这是必要的。我在许多大型项目上工作,其中有许多命名查询附加到一些实体上,我不认为这会使源头混乱 - 毕竟所有查询都在类定义之前。使用注释的主要优点是您可以查看源代码中的所有内容。如果您已经在xml配置中提取查询,那么指定查询的存在将不会立即可见,我认为这是一个缺点。我喜欢保持纯粹的东西 - 无论是仅安装xml还是仅安装注释。我通常在persistence.xml中保留JPA项目中唯一的xml配置。
当您在不同的组件之间共享模型时,真正的需求可能会来临,单独的JAR文件中的一些公共API规范及其依赖于JPA持久性的实现)。而不是让它们都依赖于JPA,最好是在类之外进行映射。 – 2016-08-22 10:14:04
我知道这有点晚,但我遇到了这个问题,在我的项目中,我一直在使用org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean(当然是在Spring容器中)。我非常喜欢JPA,我相信它会让生活更轻松,但是我想在不使用Hibernate,JPA,Spring或任何好东西的项目中使用我的领域类。如果可能的话,我们认为最好让我们的某些域类不含Java Persistence注释。
我知道这是一个很简单的事情,可能很明显,但它花了我一段时间。下面是我的榜样POJO注意,我没有注释:
package mypackage.domain;
public class Profile {
private Long id;
private String friendlyName;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getFriendlyName() { return friendlyName; }
public void setFriendlyName(String friendlyName)
{ this.friendlyName = friendlyName; }
}
在src/main/java/mypackage/domain/
目录(如果你正在使用Maven),你应该把一个不错的,传统的XML映射文件(Profile.hbm.xml):
<hibernate-mapping package="mypackage.domain" default-access="field">
<class name="Profile" table="Profile">
<id name="id" column="ID">
<generator class="native" />
</id>
<property name="friendlyName" column="FriendlyName" />
</class>
</hibernate-mapping>
你正在使用Hibernate 4.0.0.CR3这个应该没提供,Spring的配置文件(我使用3.0.6.RELEASE)就可以看起来像一个典型的JPA Hibernate配置:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="SQL_SERVER" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
META-INF/persistence.xml
是非常基本的,并且对于完整性这里是:
<persistence version="1.0">
<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>mypackage.domain.Profile</class>
</persistence-unit>
</persistence>
当然,虽然我使用JPA映射配置Hibernate的具体,所以我也追平自己在这个项目中冬眠,因为我使用在传统的姐妹项目中使用纯粹的JDBC我并不认为这是一个缺点。
由于回程机,互联网永远不会忘记任何东西。检查它在: http://web.archive.org/web/20041027182132/http://www.oracle.com/technology/pub/articles/annotations_xml.html 但原始文章是从2004年和对我所猜测的注释不那么有帮助。尽管如此,你和Bozhidar已经说服了我,我可能会忍受额外的文本行,并将指定的查询粘贴到Java代码中。这不像有人需要在客户现场或其他任何地方调整这些设置。 – HDave 2010-05-15 19:22:55