Я хотел бы использовать persistence.xml для определения двух peristence-unit
элементов (один для SqlServer и другой для Derby) с выделенной orm.xml содержащей named-native-query
.
persistence.xml
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit name="sqlserver-pu">
<mapping-file>META-INF/orm-sqlserver.xml</mapping-file>
...
</persistence-unit>
<persistence-unit name="derby-pu">
<mapping-file>META-INF/orm-derby.xml</mapping-file>
...
</persistence-unit>
</persistence>
ОРМ-sqlserver.xml
<entity-mappings version="2.0"
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_2_0.xsd">
<named-native-query name="findFirst" result-class="com.tyler.example.order">
<query>SELECT TOP 1 * FROM Order</query>
</named-native-query>
</entity-mappings>
ОРМ-derby.xml
<entity-mappings version="2.0"
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_2_0.xsd">
<named-native-query name="findFirst" result-class="com.tyler.example.order">
<query>SELECT * FROM Order FETCH FIRST ROW ONLY</query>
</named-native-query>
</entity-mappings>
При таком подходе вы улучшили совместимость вашего кода, объекты (переносимые через базы данных) отделяются от запросов (специфических поставщиков). Все, что вам нужно, - выбрать подходящую единицу времени выполнения во время выполнения и выполнить заданный запрос (они должны иметь одно и то же имя).
Другой подход, который приходит мне в голову, чтобы определить именованный родной запрос дважды для каждого объекта с использованием @NamedNativeQuery
аннотацию с различными name
и query
атрибутов, но во время выполнения вы бы тогда, вероятно, потребуется некоторое «ifology», чтобы определить правильный один.