OneToOneAttributeSourceImpl(
      MappingDocument sourceMappingDocument,
      AttributeSourceContainer container,
      final JaxbOneToOneElement oneToOneElement,
      final String logicalTableName,
      NaturalIdMutability naturalIdMutability) {
    super(sourceMappingDocument, naturalIdMutability, oneToOneElement.getPropertyRef());
    this.oneToOneElement = oneToOneElement;
    this.containingTableName = logicalTableName;
    this.valueSources =
        Helper.buildValueSources(
            sourceMappingDocument(),
            new Helper.ValueSourcesAdapter() {
              @Override
              public String getColumnAttribute() {
                // Not applicable to one-to-one
                return null;
              }

              @Override
              public String getFormulaAttribute() {
                return oneToOneElement.getFormulaAttribute();
              }

              @Override
              public List<JaxbColumnElement> getColumn() {
                // Not applicable to one-to-one
                return null;
              }

              @Override
              public List<String> getFormula() {
                return oneToOneElement.getFormula();
              }

              @Override
              public String getContainingTableName() {
                return logicalTableName;
              }

              @Override
              public boolean isIncludedInInsertByDefault() {
                return true;
              }

              @Override
              public boolean isIncludedInUpdateByDefault() {
                return false;
              }
            });

    this.attributeRole = container.getAttributeRoleBase().append(oneToOneElement.getName());
    this.attributePath = container.getAttributePathBase().append(oneToOneElement.getName());
  }
  public KeyManyToOneSourceImpl(
      MappingDocument mappingDocument,
      final JaxbKeyManyToOneElement keyManyToOneElement,
      final SingularAttributeBinding.NaturalIdMutability naturalIdMutability) {
    super(mappingDocument, naturalIdMutability, null);
    this.keyManyToOneElement = keyManyToOneElement;
    this.valueSources =
        Helper.buildValueSources(
            sourceMappingDocument(),
            new Helper.ValueSourcesAdapter() {
              @Override
              public String getColumnAttribute() {
                return keyManyToOneElement.getColumnAttribute();
              }

              @Override
              public String getFormulaAttribute() {
                return null;
              }

              @Override
              public List<JaxbColumnElement> getColumn() {
                return keyManyToOneElement.getColumn();
              }

              @Override
              public List<String> getFormula() {
                return Collections.emptyList();
              }

              @Override
              public String getContainingTableName() {
                return null;
              }

              @Override
              public boolean isIncludedInInsertByDefault() {
                return true;
              }

              @Override
              public boolean isIncludedInUpdateByDefault() {
                return false;
              }
            });
  }
  public ManyToManyPluralAttributeElementSourceImpl(
      MappingDocument mappingDocument,
      final PluralAttributeSource pluralAttributeSource,
      final JaxbManyToManyElement manyToManyElement,
      String cascadeString) {
    super(mappingDocument, pluralAttributeSource);
    this.manyToManyElement = manyToManyElement;
    this.cascadeStyles = Helper.interpretCascadeStyles(cascadeString, bindingContext());

    this.valueSources =
        Helper.buildValueSources(
            sourceMappingDocument(),
            new Helper.ValueSourcesAdapter() {
              @Override
              public boolean isIncludedInInsertByDefault() {
                return true;
              }

              @Override
              public boolean isIncludedInUpdateByDefault() {
                return true;
              }

              @Override
              public String getColumnAttribute() {
                return manyToManyElement.getColumnAttribute();
              }

              @Override
              public String getFormulaAttribute() {
                return manyToManyElement.getFormulaAttribute();
              }

              @Override
              public List<JaxbColumnElement> getColumn() {
                return manyToManyElement.getColumn();
              }

              @Override
              public List<String> getFormula() {
                return manyToManyElement.getFormula();
              }
            });
    this.filterSources = buildFilterSources();
  }
  public IdBagSourceImpl(
      MappingDocument mappingDocument,
      final JaxbIdbagElement element,
      AbstractEntitySourceImpl abstractEntitySource) {
    super(mappingDocument, element, abstractEntitySource);

    final List<RelationalValueSource> relationalValueSources =
        Helper.buildValueSources(
            sourceMappingDocument(),
            new Helper.ValueSourcesAdapter() {
              @Override
              public String getColumnAttribute() {
                return element.getCollectionId().getColumnAttribute();
              }

              @Override
              public SizeSource getSizeSource() {
                return Helper.createSizeSourceIfMapped(
                    element.getCollectionId().getLength(), null, null);
              }

              @Override
              public List<JaxbColumnElement> getColumn() {
                return element.getCollectionId().getColumn();
              }

              @Override
              public boolean isIncludedInInsertByDefault() {
                return true;
              }

              @Override
              public boolean isForceNotNull() {
                return true;
              }
            });

    ColumnSource collectionIdColumnSource = null;
    if (relationalValueSources != null && relationalValueSources.isEmpty()) {
      if (relationalValueSources.size() > 1) {
        throw makeMappingException("Expecting just a single column for collection id (idbag)");
      }

      final RelationalValueSource relationalValueSource = relationalValueSources.get(0);
      if (!ColumnSource.class.isInstance(relationalValueSource)) {
        throw makeMappingException("Expecting column for collection id (idbag), but found formula");
      }

      collectionIdColumnSource = (ColumnSource) relationalValueSource;
    }

    final HibernateTypeSource typeSource =
        new HibernateTypeSource() {
          private final String name = element.getCollectionId().getType();

          @Override
          public String getName() {
            return name;
          }

          @Override
          public Map<String, String> getParameters() {
            return Collections.emptyMap();
          }

          @Override
          public JavaTypeDescriptor getJavaType() {
            return null;
          }
        };

    this.collectionIdSource =
        new CollectionIdSourceImpl(
            collectionIdColumnSource,
            typeSource,
            element.getCollectionId().getGenerator().getClazz());
  }