Java 类org.hibernate.annotations.CollectionId 实例源码

项目:lams    文件:IdBagBinder.java   
@Override
protected boolean bindStarToManySecondPass(
        Map persistentClasses,
        XClass collType,
        Ejb3JoinColumn[] fkJoinColumns,
        Ejb3JoinColumn[] keyColumns,
        Ejb3JoinColumn[] inverseColumns,
        Ejb3Column[] elementColumns,
        boolean isEmbedded,
        XProperty property,
        boolean unique,
        TableBinder associationTableBinder,
        boolean ignoreNotFound,
        Mappings mappings) {
    boolean result = super.bindStarToManySecondPass(
            persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns, isEmbedded,
            property, unique, associationTableBinder, ignoreNotFound, mappings
    );
    CollectionId collectionIdAnn = property.getAnnotation( CollectionId.class );
    if ( collectionIdAnn != null ) {
        SimpleValueBinder simpleValue = new SimpleValueBinder();

        PropertyData propertyData = new WrappedInferredData(
                new PropertyInferredData(
                        null,
                        property,
                        null, //default access should not be useful
                        mappings.getReflectionManager()
                ),
                "id"
        );
        Ejb3Column[] idColumns = Ejb3Column.buildColumnFromAnnotation(
                collectionIdAnn.columns(),
                null,
                Nullability.FORCED_NOT_NULL,
                propertyHolder,
                propertyData,
                Collections.EMPTY_MAP,
                mappings
        );
        //we need to make sure all id columns must be not-null.
        for(Ejb3Column idColumn:idColumns){
            idColumn.setNullable(false);
        }
        Table table = collection.getCollectionTable();
        simpleValue.setTable( table );
        simpleValue.setColumns( idColumns );
        Type typeAnn = collectionIdAnn.type();
        if ( typeAnn != null && !BinderHelper.isEmptyAnnotationValue( typeAnn.type() ) ) {
            simpleValue.setExplicitType( typeAnn );
        }
        else {
            throw new AnnotationException( "@CollectionId is missing type: "
                    + StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
        }
        simpleValue.setMappings( mappings );
        SimpleValue id = simpleValue.make();
        ( (IdentifierCollection) collection ).setIdentifier( id );
        String generator = collectionIdAnn.generator();
        String generatorType;
        if ( "identity".equals( generator ) || "assigned".equals( generator )
                || "sequence".equals( generator ) || "native".equals( generator ) ) {
            generatorType = generator;
            generator = "";
        }
        else {
            generatorType = null;
        }
        BinderHelper.makeIdGenerator( id, generatorType, generator, mappings, localGenerators );
    }
    return result;
}