混合JPA注释和XML配置

混合JPA注释和XML配置,xml,configuration,jpa,named,Xml,Configuration,Jpa,Named,我有一个相当大的(新的)项目,其中我们用JPA映射注释了许多域类。现在是实现许多命名查询的时候了——一些实体可能有多达15-20个命名查询。我认为在注释中编写这些命名查询会使源文件变得混乱,因此我考虑将它们放在XML映射文件中 这可能吗 莫特:重要的是,这合理吗 有更好的方法吗 这是怎么做到的?这是可能的,但我认为没有必要。我在很多大型项目中工作,许多命名查询附加到一些实体,我不认为这会对源代码造成太大的混乱——毕竟所有查询都在类定义之前。使用注释的主要优点是可以看到源代码中的所有内容。如果在X

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

这可能吗

莫特:重要的是,这合理吗

有更好的方法吗


这是怎么做到的?

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

这可能吗

是的,但趋势是更加集中,而不是相反

更重要的是,这是否合理

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

有更好的方法吗

我相信使用注释是最好的做法1

这是怎么做到的

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


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

我知道这有点晚,但我遇到了这个问题,在我的项目中,我一直在使用org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean(当然是在Spring容器中)。我真的很喜欢JPA,我相信它会让生活更轻松,但我想在一个不使用Hibernate、JPA、Spring或其他任何好东西的项目中使用我的域类。我们决定,如果可能的话,最好让一些域类没有Java持久性注释

我知道这是一件很简单的事情,对很多人来说可能是显而易见的,但这花了我一段时间。下面是我的示例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):


当然,虽然我使用的是JPA,但映射配置是特定于Hibernate的,因此我在这个项目中将自己绑定到Hibernate,因为我在遗留姐妹项目中使用纯JDBC,所以我不认为这是一个缺点。

多亏了way back机器,互联网永远不会忘记任何东西。请访问:然而,这篇原创文章是从2004年开始的,它并没有像我猜想的那样对注释进行补充。尽管如此,您和Bozhidar说服了我,我还是可以忍受额外的文本行,并将命名查询粘贴到Java代码中。这并不是说有人需要在客户站点或其他任何地方对其进行调整。真正的需要可能是在不同组件之间共享模型,例如,在单独的JAR文件中的一些公共API规范及其依赖JPA持久性的实现)。与其让它们都依赖于JPA,不如将映射放在类之外。
<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>
<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>
<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>