我有一个相当大的(新)项目,我们在其中使用 JPA 映射注释了许多域类。现在是时候实现许多命名查询了——一些实体可能有多达 15-20 个命名查询。我认为在注释中编写这些命名查询会使源文件变得混乱,因此正在考虑将它们放入 XML 映射文件中。
这可能吗?
更重要的是,这合理吗?
有更好的方法吗?
这是怎么做到的?
我有一个相当大的(新)项目,我们在其中使用 JPA 映射注释了许多域类。现在是时候实现许多命名查询了——一些实体可能有多达 15-20 个命名查询。我认为在注释中编写这些命名查询会使源文件变得混乱,因此正在考虑将它们放入 XML 映射文件中。
这可能吗?
更重要的是,这合理吗?
有更好的方法吗?
这是怎么做到的?
这可能吗?
是的,但趋势更多的是集中化事物,而不是相反。
更重要的是,这合理吗?
我不会因为在我的实体类文件顶部有一个注释块而烦恼。实际上,我喜欢将我的查询放在我认为属于它们的地方:在实体旁边。我还喜欢在 Java 代码中编写查询时获得的编译时检查(实体名称、属性)和代码完成(不确定我的 IDE 是否会使用 xml 映射来做到这一点)。换句话说,我觉得没有必要也不想外部化查询。
有更好的方法吗?
我相信使用注释是最佳实践1。
这是怎么做到的?
建议仅将 XML 映射文件用于特定于特定数据库的本机 SQL 语句(当然,我省略了您无法注释的遗留代码的明显情况)。换句话说,使用注解,但尽可能让代码不受供应商特定的东西影响。
1 JPA 1.0 规范的共同负责人Mike Keith在 OTN 专栏“是否添加注释”中介绍了与 XML 元数据策略(XML 策略)与源内元数据策略(注释策略)相关的许多权衡取舍。可悲的是,我找不到他的出版物的非死链接。也许你会更幸运,在这种情况下,阅读它。
我知道这有点晚了,但我遇到了这个,在我的项目中我一直在使用 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 配置。