Czy klasa jednostki JPA może zawierać dwa @Embedded
pola embedded ( )? Przykładem może być:
@Entity
public class Person {
@Embedded
public Address home;
@Embedded
public Address work;
}
public class Address {
public String street;
...
}
W tym przypadku Person
może zawierać dwie Address
instancje - dom i praca. Używam JPA z implementacją Hibernate. Kiedy generuję schemat za pomocą narzędzi Hibernate Tools, osadza tylko jeden Address
. Chciałbym mieć dwie osadzone Address
instancje, każda z wyróżnionymi nazwami kolumn lub poprzedzonymi jakimś prefiksem (np. Dom i praca). Wiem o tym @AttributeOverrides
, ale wymaga to indywidualnego nadpisania każdego atrybutu. Może to być kłopotliwe, jeśli osadzony obiekt ( Address
) staje się duży, ponieważ każda kolumna musi być indywidualnie nadpisana.
źródło
name="street"
odnosi się to do nazwy właściwości, a nie do nazwy kolumny.W przypadku korzystania z łącza Eclipse, alternatywa dla korzystania z AttributeOverrides go do korzystania z SessionCustomizer. To rozwiązuje problem dla wszystkich podmiotów za jednym razem:
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); } } } } } } } }
źródło
classDescriptor.getJavaClass()
w SessionCustomizer listy klas, na które chcę, aby miało to wpłynąć.Jeśli używasz hibernacji, możesz również użyć innego schematu nazewnictwa, który dodaje unikalne przedrostki do kolumn dla identycznych pól osadzonych. Zobacz Automatyczne dodawanie przedrostka do nazw kolumn dla klas @Embeddable
źródło