¿Es posible que una clase de entidad JPA contenga dos @Embedded
campos incrustados ( )? Un ejemplo sería:
@Entity
public class Person {
@Embedded
public Address home;
@Embedded
public Address work;
}
public class Address {
public String street;
...
}
En este caso, a Person
puede contener dos Address
instancias: hogar y trabajo. Estoy usando JPA con la implementación de Hibernate. Cuando genero el esquema usando Hibernate Tools, solo incrusta uno Address
. Lo que me gustaría son dos Address
instancias incrustadas , cada una con sus nombres de columna distinguidos o precedidos por algún prefijo (como casa y trabajo). Lo sé @AttributeOverrides
, pero esto requiere que cada atributo sea anulado individualmente. Esto puede volverse engorroso si el objeto incrustado ( Address
) aumenta de tamaño, ya que cada columna debe anularse individualmente.
fuente
name="street"
refiere al nombre de la propiedad, no al nombre de la columna.Al usar Eclipse Link, una alternativa al uso de Attribute lo invalida para usar un SessionCustomizer. Esto resuelve el problema para todas las entidades de una sola vez:
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); } } } } } } } }
fuente
classDescriptor.getJavaClass()
en SessionCustomizer una lista de clases a las que quiero que afecte.En caso de que esté usando hibernación, también puede usar un esquema de nomenclatura diferente que agrega prefijos únicos a las columnas para campos incrustados idénticos. Consulte Agregar automáticamente un prefijo a los nombres de las columnas para las clases @Embeddable
fuente