Возможно ли, чтобы класс сущности JPA содержал два @Embedded
поля embedded ( )? Примером может быть:
@Entity
public class Person {
@Embedded
public Address home;
@Embedded
public Address work;
}
public class Address {
public String street;
...
}
В этом случае a Person
может содержать два Address
экземпляра - домашний и рабочий. Я использую JPA с реализацией Hibernate. Когда я генерирую схему с помощью Hibernate Tools, она встраивает только одну Address
. Я бы хотел два встроенных Address
экземпляра, каждый с именами столбцов, выделенными или предваренными некоторым префиксом (например, домашний и рабочий). Я знаю @AttributeOverrides
, но для этого требуется, чтобы каждый атрибут был индивидуально переопределен. Это может стать громоздким, если встроенный объект ( Address
) становится большим, так как каждый столбец необходимо индивидуально переопределить.
источник
name="street"
относится к имени свойства, а не к имени столбца.При использовании Eclipse Link альтернативой AttributeOverrides является использование SessionCustomizer. Это решает проблему для всех сущностей за один раз:
public class EmbeddedFieldNamesSessionCustomizer implements SessionCustomizer { @SuppressWarnings("rawtypes") @Override public void customize(Session session) throws Exception { Map<Class, ClassDescriptor> descriptors = session.getDescriptors(); for (ClassDescriptor classDescriptor : descriptors.values()) { for (DatabaseMapping databaseMapping : classDescriptor.getMappings()) { if (databaseMapping.isAggregateObjectMapping()) { AggregateObjectMapping m = (AggregateObjectMapping) databaseMapping; Map<String, DatabaseField> mapping = m.getAggregateToSourceFields(); ClassDescriptor refDesc = descriptors.get(m.getReferenceClass()); for (DatabaseMapping refMapping : refDesc.getMappings()) { if (refMapping.isDirectToFieldMapping()) { DirectToFieldMapping refDirectMapping = (DirectToFieldMapping) refMapping; String refFieldName = refDirectMapping.getField().getName(); if (!mapping.containsKey(refFieldName)) { DatabaseField mappedField = refDirectMapping.getField().clone(); mappedField.setName(m.getAttributeName() + "_" + mappedField.getName()); mapping.put(refFieldName, mappedField); } } } } } } } }
источник
classDescriptor.getJavaClass()
в SessionCustomizer список классов, на которые я хочу повлиять.Если вы используете спящий режим, вы также можете использовать другую схему именования, которая добавляет уникальные префиксы к столбцам для идентичных встроенных полей. См. Раздел Автоматическое добавление префикса к именам столбцов для классов @Embeddable.
источник