2010-05-15 80 views
3

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

这可能吗?

重要的是,这是合理的吗?

有没有更好的方法?

这是如何完成的?

回答

6

这可能吗?

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

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

我不是通过在我的实体类文件的顶部具有注释块恼火。其实,喜欢有我的问题,我认为他们属于:实体旁边。 也喜欢编写时间检查(关于实体名称,属性)和我在Java代码中编写查询时得到的代码完成(不知道我的IDE会用xml映射来做这件事)。换句话说,不觉得需要,也不想外化查询。

有没有更好的方法?

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

这是怎么完成的?

的建议是使用XML映射文件仅适用于那些具体特定数据库(当然,我忽略的遗留代码明显的例子,你不能注释)原生SQL语句。换句话说,请使用注释,但尽可能使代码免受特定于供应商的内容的影响。

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

+0

由于回程机,互联网永远不会忘记任何东西。检查它在: http://web.archive.org/web/20041027182132/http://www.oracle.com/technology/pub/articles/annotations_xml.html 但原始文章是从2004年和对我所猜测的注释不那么有帮助。尽管如此,你和Bozhidar已经说服了我,我可能会忍受额外的文本行,并将指定的查询粘贴到Java代码中。这不像有人需要在客户现场或其他任何地方调整这些设置。 – HDave 2010-05-15 19:22:55

1

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

+0

当您在不同的组件之间共享模型时,真正的需求可能会来临,单独的JAR文件中的一些公共API规范及其依赖于JPA持久性的实现)。而不是让它们都依赖于JPA,最好是在类之外进行映射。 – 2016-08-22 10:14:04

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的具体,所以我也追平自己在这个项目中冬眠,因为我使用在传统的姐妹项目中使用纯粹的JDBC我并不认为这是一个缺点。