2010-03-03 132 views
19

我试图将我的命名查询放在我的orm.xml中(放在META-INF和persistence.xml中),但是我的orm.xml似乎被hibernate忽略/ JPA。在orm.xml中使用jpa和hibernate定义命名查询

当我尝试使用em.createNamedQuery(“myQuery”)创建我的命名查询时,它返回它无法找到此查询。

我使用注释,我想在orm.xml(仅此)中将我的命名查询外部化。

这里是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <mapping-file>META-INF/orm.xml</mapping-file> 

    <class>com.mysite.Account</class> 

    <properties> 
     <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> 
     <property name="hibernate.cache.use_query_cache" value="true" /> 
     <property name="hibernate.cache.use_second_level_cache" value="true" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="use_sql_comments" value="false" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" /> 
     <property name="hibernate.c3p0.min_size" value="5" /> 
     <property name="hibernate.c3p0.max_size" value="20" /> 
     <property name="hibernate.c3p0.timeout" value="300" /> 
     <property name="hibernate.c3p0.max_statements" value="50" /> 
     <property name="hibernate.c3p0.idle_test_period" value="3000" /> 

     <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" /> 
    </properties> 

</persistence-unit> 

</persistence> 

这里是我的orm.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0"> 

<package>com.mysite</package> 

<entity class="Account"> 
    <sql-result-set-mapping name="nicknames"> 
     <column-result name="nickname" /> 
    </sql-result-set-mapping> 
    <table name="Account" /> 
    <named-native-query name="myQuery" result-set-mapping="nicknames"> 
     <query><![CDATA[select a.nickname from Account a]]> 
    </query> 
    </named-native-query> 
</entity> 
</entity-mappings> 

我做错了吗?为什么我的orm.xml被忽略?

感谢

+0

您的“帐户”映射成功了吗?即你可以做一个查询,像'em.find(Account.class,someId)'? – Bozho 2010-03-03 19:56:29

+1

是的,我的帐户映射良好,因为我使用它成功地进行了注释。 – 2010-03-04 14:31:02

回答

10

好吧,我终于得到了它!

我在META-INF目录中保存了我的orm.xml文件。当我把这个文件移动到我的包含我的域对象的包中时(如我的示例:com.mysite),orm.xml不会被忽略,并且全部运行。

我还需要修改映射文件的路径(persistence.xml中):COM/mysite的/ orm.xml中

+1

@Jerome C.很高兴知道(+1)。我会尝试。 – 2010-03-04 16:22:10

+0

为什么这被标记为问题的答案? – 2015-07-15 17:49:52

+0

,因为这是解决问题的答案;) – 2015-07-16 07:33:44

2

至于说

当我尝试创建我的em.createNamedQuery( “更改为MyQuery”),它返回它无法找到该查询命名查询。

你说得对。但是你忘了以下

如果你把一个命名查询定义一个元素中,而不是根,它的前缀是实体类的名称

所以你需要调用您的namedQuery为

em.createNamedQuery("Account.myQuery") 

我很好奇:您的Account类是否存储在根类路径中?如果没有,你已经修复了缺失的软件包。假设Account类存储在br.com.hibernate.model.domain.Account中。所以,你应该申报的实体

<entity class="br.com.hibernate.model.domain.Account" instead 

而且你需要打电话给你namedQuery作为

em.createNamedQuery("br.com.hibernate.model.domain.Account.myQuery") instead 

只是一个adivice:当您正在使用Hibernate作为持久性提供,你不需要定义persistence.xml文件中的实体类。

问候,

+0

不错,我怀疑这种类型的东西,但没有在xsd中找到解释。你可以链接那些写的文档吗?这是规格吗? – Bozho 2010-03-04 07:57:29

+0

@Bohzo Ok,Bohzo。使用Hibernate的Java持久性书:定义XML元数据中的命名查询。除此之外,JPA规范对此进行了讨论。 – 2010-03-04 13:53:09

+0

那不运行。我试过所有的解决方案。对于完整的路径名,我认为package标签在这里是为了指定当你命名实体时使用的默认包,no? 为了简化,我还尝试将命名查询放入根实体映射标记中,但没有结果。就像我说的,orm.xml被忽略,因为如果我在xml中创建一个错误(没有结束标记),我在休眠启动时没有错误... – 2010-03-04 14:34:06

0

“META-INF/orm.xml中” 是将要看着默认的映射文件由任何符合JPA标准的实体经理提供。实际上,如果你的映射文件是“META-INF/orm.xml”,你甚至不需要在你的persistence.xml中定义这个文件。

这是Hibernate配置手册说一下:

类元素指定一个EJB3兼容XML映射文件,您将映射。该文件必须位于类路径中。根据EJB3规范,Hibernate EntityManager将尝试加载位于META_INF/orm.xml的jar文件中的映射文件。当然,任何显式映射文件也将被加载。事实上,您可以在映射文件元素中提供任何XML文件。 hbm文件或EJB3部署描述符。

Reference: Hibernate configuration

4

你orm.xml中中有一个小错误,打破了整个事情。重点是元素声明的顺序应该符合各自的XML模式(尤其是http://java.sun.com/xml/ns/persistence/orm_1_0.xsd)。通过验证xml模式的验证器来运行xml代码很容易。下面是你的orm.xml的修正版本,它必须作为一个魅力工作。

<?xml version="1.0" encoding="UTF-8"?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation=" 
        http://java.sun.com/xml/ns/persistence/orm 
        http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" 
       version="1.0"> 

    <package>com.mysite</package> 

    <entity class="Account"> 
     <table name="Account" /> 
     <named-native-query name="myQuery" result-set-mapping="nicknames"> 
      <query><![CDATA[ 
      select a.nickname from Account a 
      ]]></query> 
     </named-native-query> 
     <sql-result-set-mapping name="nicknames"> 
      <column-result name="nickname" /> 
     </sql-result-set-mapping> 
    </entity> 
</entity-mappings>