【发布时间】:2011-02-19 19:13:08
【问题描述】:
我有一个相当大的(新)项目,我们在其中使用 JPA 映射注释了许多域类。现在是时候实现许多命名查询了——一些实体可能有多达 15-20 个命名查询。我认为在注释中编写这些命名查询会使源文件变得混乱,因此正在考虑将它们放入 XML 映射文件中。
这可能吗?
更重要的是,这合理吗?
有更好的方法吗?
这是怎么做到的?
【问题讨论】:
标签: xml configuration jpa named
我有一个相当大的(新)项目,我们在其中使用 JPA 映射注释了许多域类。现在是时候实现许多命名查询了——一些实体可能有多达 15-20 个命名查询。我认为在注释中编写这些命名查询会使源文件变得混乱,因此正在考虑将它们放入 XML 映射文件中。
这可能吗?
更重要的是,这合理吗?
有更好的方法吗?
这是怎么做到的?
【问题讨论】:
标签: xml configuration jpa named
这可能吗?
是的,但趋势更多的是集中化事物,而不是相反。
更重要的是,这合理吗?
我不会因为在我的实体类文件的顶部有一个注释块而烦恼。实际上,我喜欢将我的查询放在我认为它们所属的地方:实体旁边。 我还喜欢编译时检查(实体名称、属性)和我在 Java 代码中编写查询时获得的代码完成(不确定我的 IDE 是否会使用 xml 映射)。换句话说,我不觉得有必要也不想将查询外部化。
有更好的方法吗?
我认为使用注释是最佳做法1。
这是怎么做到的?
建议仅对特定数据库特定的本机 SQL 语句使用 XML 映射文件(当然,我省略了您无法注释的遗留代码的明显情况)。换句话说,使用注解,但尽可能让代码不受供应商特定的东西影响。
1 JPA 1.0 规范联合负责人Mike Keith 涵盖了与 XML 元数据策略(XML 策略)与源内元数据策略(注释策略)在 OTN 列“是否注释”中。可悲的是,我找不到他的出版物的非死链接。也许你会更幸运,在这种情况下,阅读它。
【讨论】:
我知道这有点晚了,但我遇到了这个,在我的项目中我一直在使用 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 的,所以我在这个项目中将自己绑定到 Hibernate,因为我在遗留姐妹项目中使用纯 JDBC,我不认为它是一个缺点。
【讨论】:
这是可能的,但我认为没有必要。我在许多大型项目中工作,许多命名查询附加到某些实体,我认为这不会使源代码混乱 - 毕竟所有查询都在类定义之前。使用注释的主要优点是您可以看到源代码中的所有内容。如果您在 xml 配置中提取了查询,则命名查询的存在将不会立即可见,我认为这是一个缺点。我喜欢保持纯粹的东西——要么只设置 xml,要么只设置注释。我通常在 persistence.xml 中的 JPA 项目中保留的唯一 xml 配置。
【讨论】: