JPA Multiple Embedded fields

前端 未结 4 2093
清酒与你
清酒与你 2020-11-30 01:20

Is it possible for a JPA entity class to contain two embedded (@Embedded) fields? An example would be:

@Entity
public class Person {
    @Embedd         


        
相关标签:
4条回答
  • 2020-11-30 01:24

    When using Eclipse Link, an alternative to using AttributeOverrides it to use a SessionCustomizer. This solves the issue for all entities in one go:

    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);
                            }
                        }
    
                    }
                }
    
            }
        }
    }
    
    }
    
    0 讨论(0)
  • 2020-11-30 01:26

    The generic JPA way to do it is with @AttributeOverride. This should work in both EclipseLink and Hibernate.

    @Entity 
    public class Person {
      @AttributeOverrides({
        @AttributeOverride(name="street",column=@Column(name="homeStreet")),
        ...
      })
      @Embedded public Address home;
    
      @AttributeOverrides({
        @AttributeOverride(name="street",column=@Column(name="workStreet")),
        ...
      })
      @Embedded public Address work;
      }
    
      @Embeddable public class Address {
        @Basic public String street;
        ...
      }
    }
    
    0 讨论(0)
  • 2020-11-30 01:33

    If you want to have the same embeddable object type twice in the same entity, the column name defaulting will not work: at least one of the columns will have to be explicit. Hibernate goes beyond the EJB3 spec and allows you to enhance the defaulting mechanism through the NamingStrategy. DefaultComponentSafeNamingStrategy is a small improvement over the default EJB3NamingStrategy that allows embedded objects to be defaulted even if used twice in the same entity.

    From Hibernate Annotations Doc: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#d0e714

    0 讨论(0)
  • 2020-11-30 01:35

    In case you are using hibernate you can also use a different naming scheme which adds unique prefixes to columns for identical embedded fields. See Automatically Add a Prefix to Column Names for @Embeddable Classes

    0 讨论(0)
提交回复
热议问题