混合JPA注释和XML配置

时间:2010-05-15 04:12:13

标签: xml configuration jpa named

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

这可能吗?

重要的是,这是否合理?

有更好的方法吗?

这是怎么做到的?

3 个答案:

答案 0 :(得分:6)

  

这可能吗?

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

  

更重要的是,这是否合理?

对我的实体类文件顶部有一个注释块并不感到烦恼。实际上,喜欢在我认为属于我的查询的地方:实体旁边。 I 也喜欢编译时间检查(在实体名称,属性上)和在Java代码中编写查询时得到的代码完成(不确定我的IDE会用xml映射来完成)。换句话说,感觉不需要,也不想外化查询。

  

有更好的方法吗?

我认为使用注释是最佳实践 1

  

这是怎么做到的?

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

1 JPA 1.0规范共同领导Mike Keith涵盖了与XML元数据策略(XML策略)相关的许多权衡与源内元数据策略(注释策略)OTN列中的“注释或不注释”。可悲的是,我找不到他的出版物的非死链接。也许你会更幸运,在这种情况下,请阅读它。

答案 1 :(得分: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,我不认为这是一个缺点。

答案 2 :(得分:1)

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