3

我有一个相当大的(新)项目,我们在其中使用 JPA 映射注释了许多域类。现在是时候实现许多命名查询了——一些实体可能有多达 15-20 个命名查询。我认为在注释中编写这些命名查询会使源文件变得混乱,因此正在考虑将它们放入 XML 映射文件中。

这可能吗?

更重要的是,这合理吗?

有更好的方法吗?

这是怎么做到的?

4

3 回答 3

6

这可能吗?

是的,但趋势更多的是集中化事物,而不是相反。

更重要的是,这合理吗?

不会因为在我的实体类文件顶部有一个注释块而烦恼。实际上,喜欢将我的查询放在我认为属于它们的地方:在实体旁边。还喜欢在 Java 代码中编写查询时获得的编译时检查(实体名称、属性)和代码完成(不确定我的 IDE 是否会使用 xml 映射来做到这一点)。换句话说,觉得没有必要也不想外部化查询。

有更好的方法吗?

我相信使用注释是最佳实践1

这是怎么做到的?

建议仅将 XML 映射文件用于特定于特定数据库的本机 SQL 语句(当然,我省略了您无法注释的遗留代码的明显情况)。换句话说,使用注解,但尽可能让代码不受供应商特定的东西影响。

1 JPA 1.0 规范的共同负责人Mike Keith在 OTN 专栏“是否添加注释”中介绍了与 XML 元数据策略(XML 策略)与源内元数据策略(注释策略)相关的许多权衡取舍。可悲的是,我找不到他的出版物的非死链接。也许你会更幸运,在这种情况下,阅读它。

于 2010-05-15T10:55:01.060 回答
2

我知道这有点晚了,但我遇到了这个,在我的项目中我一直在使用 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,我不认为它是一个缺点。

于 2011-09-25T16:31:04.920 回答
1

这是可能的,但我认为没有必要。我从事许多大型项目,其中许多命名查询附加到某些实体,我认为这不会使源代码混乱 - 毕竟所有查询都在类定义之前。使用注释的主要优点是您可以看到源代码中的所有内容。如果您在 xml 配置中提取了查询,则命名查询的存在将不会立即可见,我认为这是一个缺点。我喜欢保持纯粹的东西——要么只设置 xml,要么只设置注释。我通常在 persistence.xml 中的 JPA 项目中保留的唯一 xml 配置。

于 2010-05-15T04:44:36.627 回答