Я пытаюсь найти обходной путь для ошибки EclipseLink bugs.eclipse.org/bugs/show_bug.cgi?id=344448.
Проблема заключается в том, что EclipseLink выбирает первичный ключ, созданный из сущностиID + идентификатор значения хэш-карты для каждой записи HashMap.Я хотел бы изменить, чтобы вместо этого иметь первичный ключ идентификатора объекта + идентификатор ключа hashmap.Это связано не только с ограничением первичного ключа, но и с инструкциями SQL, сгенерированными EclipseLink, например, delete, update и т. Д. *
Итак ... Я видел, что есть способ настроить это поведениеиспользуя Customiser и захватывая ManyToManyMapping поля hashmap и изменяя все, что нужно.Я не могу найти много документации по этому вопросу, поэтому я вроде как что-то пробую ... но пока безуспешно.
public class ConfigureValuesFilter implements DescriptorCustomizer {
public void customize(ClassDescriptor descriptor) throws Exception {
ManyToManyMapping mapping = (ManyToManyMapping) descriptor
.getMappingForAttributeName("values");
// various attempts
}
Я попытался установить первичный ключ с помощью mapping.setTargetRelationKeyFieldName ("value_KEY");и setTargetKeyFieldNames (зачем нужны оба?), но это привело к индексу массива из-за связанной ошибки с таблицей (из ключа), которую я хочу использовать, недоступной в дескрипторе, см. ниже.
Exception Description: The table [CASEVALUE] is not present in this descriptor.
Descriptor: RelationalDescriptor(testdb.EULADocument --> [DatabaseTable(EULADOCUMENT)])
Затем я попытался изменить оператор запроса на удаление с помощью setDeleteSQLString, но я застрял на том, как передать значения параметров
mapping.setDeleteSQLString("DELETE FROM LICENSE_EULADOCUMENT WHERE ((values_KEY = #VALUES_KEY) AND (License_ID = #LICENSE_ID))");
говорит, что не может найти VALUES_KEY, поэтому устанавливает его в NULL ...
Каков рекомендуемый способ изменения поведения?