Мы используем OPENJPA с Tomcat, работающим с устаревшим проприетарным пакетом org.apache.renamed.openjpa, подготовленным Elatic Path Software. Мы обнаружили, что для выполнения некоторых запросов необходимо отключить QuerySQLCache. Например, следующий довольно сложный запрос:
ВЫБЕРИТЕ t0.CARRIER, t0.CODE, t0.DEFAULT_COST, t0.ENABLED, t0.GUID, t0.LAST_MODIFIED_DATE, t1.UIDPK, t1.TYPE, t2.UIDPK, t2.GUID, t2.NAME, t2.REGION_STR, t3 .UIDPK, t4.UIDPK, t4.CATALOG_CODE, t4.DEFAULT_LOCALE, t4.MASTER, t4.NAME, t3.STORECODE, t3.CONTENT_ENCODING, t3.COUNTRY, t3.CREDIT_CARD_CVV2_ENABLED, t3.DEFAULT_CURRENCY, t3.DEFAULT_DERIPTION,DEFAULT_LOCALE , t3.DISPLAY_OUT_OF_STOCK, t3.EMAIL_SENDER_ADDRESS, t3.EMAIL_SENDER_NAME, t3.ENABLED, t3.NAME, t3.STORE_ADMIN_EMAIL, t3.STORE_FULL_CREDIT_CARDS, t3.STORE_STATE, t3.STORE_TYPE, t3.SUB_TIMEONE, t3.STORE_TYPE, t3.SUB_TIMEONE, t3.TIME .Object_uid, t5.uidpk, t5.type, t5.localized_property_key, t5.value от tshippingserviCelevel t0 левый внешний присоединение tshippingcostcalculationmethod t1 на t0.sccm_uid = t1.uidpk оставлена внешняя присоединение tshipping_uid t2 на T0.shippect_region_uid TSTORE t3 ON t0.STORE_UID = t3.UIDPK LEFT OUTER JOIN TLOCALIZEDPROPERTIES t5 ON t0.UIDPK = t5.OBJECT_UID AND ? = t5.TYPE LEFT OUTER JOIN TCATALOG t4 ON t3.CATALOG_UID = t4.UIDPK ГДЕ t0.UIDPK = ?
приводит к ошибке:
org.apache.renamed.openjpa.persistence.PersistenceException: No value specified for parameter 2
Ошибка не возникает, когда кеш отключен. Обратите внимание, что источником этого запроса являются сложные отношения выборки, написанные способом, характерным для OPENJPA.
Он начинается с поиска заказа, содержащего Группа выборки и отгрузки (интерфейс ShipOrder). Из реализации ShipOrder (PhysicalOrderShipmentImpl) мы получаем shippingServiceLevelInternal, что приводит к оператору выбора для TSHIPPINGSERVICELEVEL (см. код ниже).
@FetchGroup(name = FetchGroupConstants.ORDER_SEARCH, attributes = {
@FetchAttribute(name = "orderNumber"),
@FetchAttribute(name = "shipments"),
...
@DataCache(enabled = false)
public class OrderImpl extends AbstractListenableEntityImpl
private List<OrderShipment> shipments = new ArrayList<OrderShipment>();
public interface PhysicalOrderShipment extends OrderShipment
...
ShippingServiceLevel getShippingServiceLevel();
@FetchGroup(name = FetchGroupConstants.ORDER_DEFAULT, attributes = {
@FetchAttribute(name = "shipmentAddressInternal"),
@FetchAttribute(name = "shippingServiceLevelInternal")
}, fetchGroups = { FetchGroupConstants.DEFAULT }, postLoad = true)
})
@DataCache(enabled = false)
public class PhysicalOrderShipmentImpl extends AbstractOrderShipmentImpl implements PhysicalOrderShipment {
...
/**
* Gets the shipping service level.
*
* @return ShippingServiceLevel the shipping service level
*/
ShippingServiceLevel getShippingServiceLevel();
Из журнала я также вижу некоторые проблемы с кэшем QuerySQL:
catalina.07080951.out:DEBUG Отсутствие кеша при поиске ключа "org.apache.renamed.openjpa.datacache.QueryKey@9202a145 [запрос: [ВЫБЕРИТЕ sr FROM ShippingRegionImpl sr ORDER BY sr.name], путь доступа: [com.elasticpath.domain.shipping.impl.ShippingRegionImpl],subs:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,timeout:1800000]". catalina.07080951.out:DEBUG Поместите ключ "org.apache.renamed.openjpa.datacache.QueryKey@9202a145[запрос: [ВЫБЕРИТЕ sr FROM ShippingRegionImpl sr ORDER BY sr.name], путь доступа: [com.elasticpath.domain.shipping .impl.ShippingRegionImpl],subs:true,ignoreChanges:false,startRange:0,endRange:9223372036854775807,timeout:1800000]" в кеш.
Есть ли способ исправить наше приложение, позволяющее включать QuerySQLCache в OpenJPA? Извините за не совсем понятный пример кода, весь код займет много места. Подсказки приветствуются.