【问题标题】:Mixing JPA annotations and XML configuration混合 JPA 注释和 XML 配置
【发布时间】:2011-02-19 19:13:08
【问题描述】:

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

这可能吗?

更重要的是,这合理吗?

有更好的方法吗?

这是怎么做到的?

【问题讨论】:

    标签: xml configuration jpa named


    【解决方案1】:

    这可能吗?

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

    更重要的是,这合理吗?

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

    有更好的方法吗?

    我认为使用注释是最佳做法1

    这是怎么做到的?

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

    1 JPA 1.0 规范联合负责人Mike Keith 涵盖了与 XML 元数据策略(XML 策略)与源内元数据策略(注释策略)在 OTN 列“是否注释”中。可悲的是,我找不到他的出版物的非死链接。也许你会更幸运,在这种情况下,阅读它。

    【讨论】:

    • 感谢回程机器,互联网永远不会忘记任何事情。在以下位置查看:web.archive.org/web/20041027182132/http://www.oracle.com/… 然而,原始文章来自 2004 年,我猜想的注释较少。尽管如此,您和 Bozhidar 已经说服我,我还不如忍受额外的文本行并将命名查询粘贴在 Java 代码中。这并不像有人需要在客户站点或任何地方调整这些。
    【解决方案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,我不认为它是一个缺点。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 当你在不同的组件之间共享模型时,真正的需求可能会出现,例如单独的 JAR 文件中的一些公共 API 规范及其依赖于 JPA 持久性的实现)。与其让它们都依赖于 JPA,不如在类之外进行映射。
      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2017-08-19
      • 2011-11-01
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多