我正在尝试将我的命名查询放在我的orm.xml中(使用persistence.xml放入META-INF)但是我的orm.xml似乎被hibernate / jpa忽略了。
当我尝试使用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 :(得分:10)
好的,我终于明白了!
我将我的orm.xml保存在META-INF目录中。当我将此文件移动到我的域名对象的包中时(例如我的示例:com.mysite),orm.xml不会被忽略并且全部运行。
我还需要更改mapping-file(persistence.xml)中的路径:com / mysite / orm.xml
答案 1 :(得分: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>
答案 2 :(得分: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文件中定义您的Entity类。
的问候,
答案 3 :(得分:0)
“META-INF / orm.xml”是任何符合JPA的实体管理器将查看的默认映射文件。
实际上,如果你的映射文件是“META-INF / orm.xml”,你甚至不需要在persistence.xml中定义它。
这是hibernate配置手册中对此的说法:
class元素指定要映射的符合EJB3的XML映射文件。该文件必须位于类路径中。根据EJB3规范,Hibernate EntityManager将尝试加载位于META_INF / orm.xml的jar文件中的映射文件。当然也会加载任何显式映射文件。事实上,您可以在映射文件元素中提供任何XML文件,即。无论是hbm文件还是EJB3部署描述符。