Search in sources :

Example 1 with ManyToOne

use of org.apache.openejb.jee.jpa.ManyToOne in project tomee by apache.

the class SunConversion method mergeEntityMappings.

public void mergeEntityMappings(final Map<String, EntityData> entities, final String moduleId, final EjbModule ejbModule, final EntityMappings entityMappings, final SunCmpMapping sunCmpMapping) {
    for (final EntityMapping bean : sunCmpMapping.getEntityMapping()) {
        final SunConversion.EntityData entityData = entities.get(moduleId + "#" + bean.getEjbName());
        if (entityData == null) {
            // todo warn no such ejb in the ejb-jar.xml
            continue;
        }
        final Table table = new Table();
        // table.setSchema(schema);
        table.setName(bean.getTableName());
        entityData.entity.setTable(table);
        for (final org.apache.openejb.jee.sun.SecondaryTable sunSecondaryTable : bean.getSecondaryTable()) {
            final SecondaryTable secondaryTable = new SecondaryTable();
            secondaryTable.setName(sunSecondaryTable.getTableName());
            for (final ColumnPair columnPair : sunSecondaryTable.getColumnPair()) {
                SunColumnName localColumnName = new SunColumnName(columnPair.getColumnName().get(0), table.getName());
                SunColumnName referencedColumnName = new SunColumnName(columnPair.getColumnName().get(1), table.getName());
                // if user specified in reverse order, swap
                if (localColumnName.table != null) {
                    final SunColumnName temp = localColumnName;
                    localColumnName = referencedColumnName;
                    referencedColumnName = temp;
                }
                final PrimaryKeyJoinColumn primaryKeyJoinColumn = new PrimaryKeyJoinColumn();
                primaryKeyJoinColumn.setName(localColumnName.column);
                primaryKeyJoinColumn.setReferencedColumnName(referencedColumnName.column);
                secondaryTable.getPrimaryKeyJoinColumn().add(primaryKeyJoinColumn);
            }
        }
        for (final CmpFieldMapping cmpFieldMapping : bean.getCmpFieldMapping()) {
            final String fieldName = cmpFieldMapping.getFieldName();
            final Field field = entityData.fields.get(fieldName);
            if (field == null) {
                // todo warn no such cmp-field in the ejb-jar.xml
                continue;
            }
            final boolean readOnly = cmpFieldMapping.getReadOnly() != null;
            for (final ColumnName columnName : cmpFieldMapping.getColumnName()) {
                final SunColumnName sunColumnName = new SunColumnName(columnName, table.getName());
                final Column column = new Column();
                column.setTable(sunColumnName.table);
                column.setName(sunColumnName.column);
                if (readOnly) {
                    column.setInsertable(false);
                    column.setUpdatable(false);
                }
                field.setColumn(column);
            }
        // todo set fetch lazy when fetchWith is null
        // FetchedWith fetchedWith = cmpFieldMapping.getFetchedWith();
        }
        for (final CmrFieldMapping cmrFieldMapping : bean.getCmrFieldMapping()) {
            final String fieldName = cmrFieldMapping.getCmrFieldName();
            cmrFieldMapping.getColumnPair();
            final RelationField field = entityData.relations.get(fieldName);
            if (field == null) {
                // todo warn no such cmr-field in the ejb-jar.xml
                continue;
            }
            if (field instanceof OneToOne) {
                for (final ColumnPair columnPair : cmrFieldMapping.getColumnPair()) {
                    SunColumnName localColumnName = new SunColumnName(columnPair.getColumnName().get(0), table.getName());
                    SunColumnName referencedColumnName = new SunColumnName(columnPair.getColumnName().get(1), table.getName());
                    // if user specified in reverse order, swap
                    if (localColumnName.table != null) {
                        final SunColumnName temp = localColumnName;
                        localColumnName = referencedColumnName;
                        referencedColumnName = temp;
                    }
                    final boolean isFk = !entityData.hasPkColumnMapping(localColumnName.column);
                    if (isFk) {
                        // Make sure that the field with the FK is marked as the owning field
                        field.setMappedBy(null);
                        field.getRelatedField().setMappedBy(field.getName());
                        final JoinColumn joinColumn = new JoinColumn();
                        joinColumn.setName(localColumnName.column);
                        joinColumn.setReferencedColumnName(referencedColumnName.column);
                        field.getJoinColumn().add(joinColumn);
                    }
                }
            } else if (field instanceof OneToMany) {
                // Bi-directional OneToMany do not have field mappings
                if (!field.getRelatedField().isSyntheticField()) {
                    continue;
                }
                for (final ColumnPair columnPair : cmrFieldMapping.getColumnPair()) {
                    SunColumnName localColumnName = new SunColumnName(columnPair.getColumnName().get(0), table.getName());
                    SunColumnName otherColumnName = new SunColumnName(columnPair.getColumnName().get(1), table.getName());
                    // if user specified in reverse order, swap
                    if (localColumnName.table != null) {
                        final SunColumnName temp = localColumnName;
                        localColumnName = otherColumnName;
                        otherColumnName = temp;
                    }
                    final JoinColumn joinColumn = new JoinColumn();
                    // for OneToMany the join column name is the other (fk) column
                    joinColumn.setName(otherColumnName.column);
                    // and the referenced column is the local (pk) column
                    joinColumn.setReferencedColumnName(localColumnName.column);
                    field.getRelatedField().getJoinColumn().add(joinColumn);
                }
            } else if (field instanceof ManyToOne) {
                for (final ColumnPair columnPair : cmrFieldMapping.getColumnPair()) {
                    SunColumnName localColumnName = new SunColumnName(columnPair.getColumnName().get(0), table.getName());
                    SunColumnName referencedColumnName = new SunColumnName(columnPair.getColumnName().get(1), table.getName());
                    // if user specified in reverse order, swap
                    if (localColumnName.table != null) {
                        final SunColumnName temp = localColumnName;
                        localColumnName = referencedColumnName;
                        referencedColumnName = temp;
                    }
                    final JoinColumn joinColumn = new JoinColumn();
                    joinColumn.setName(localColumnName.column);
                    joinColumn.setReferencedColumnName(referencedColumnName.column);
                    field.getJoinColumn().add(joinColumn);
                }
            } else {
                // skip the non owning side
                if (field.getMappedBy() != null) {
                    continue;
                }
                final JoinTable joinTable = new JoinTable();
                field.setJoinTable(joinTable);
                for (final ColumnPair columnPair : cmrFieldMapping.getColumnPair()) {
                    SunColumnName localColumnName = new SunColumnName(columnPair.getColumnName().get(0), table.getName());
                    SunColumnName joinTableColumnName = new SunColumnName(columnPair.getColumnName().get(1), table.getName());
                    if (localColumnName.table == null || joinTableColumnName.table == null) {
                        // if user specified in reverse order, swap
                        if (localColumnName.table != null) {
                            final SunColumnName temp = localColumnName;
                            localColumnName = joinTableColumnName;
                            joinTableColumnName = temp;
                        }
                        // join table is the table name of the referenced column
                        joinTable.setName(joinTableColumnName.table);
                        final JoinColumn joinColumn = new JoinColumn();
                        joinColumn.setName(joinTableColumnName.column);
                        joinColumn.setReferencedColumnName(localColumnName.column);
                        joinTable.getJoinColumn().add(joinColumn);
                    } else {
                        // if user specified in reverse order, swap
                        if (localColumnName.table.equals(joinTable.getName())) {
                            final SunColumnName temp = localColumnName;
                            localColumnName = joinTableColumnName;
                            joinTableColumnName = temp;
                        }
                        final JoinColumn joinColumn = new JoinColumn();
                        joinColumn.setName(joinTableColumnName.column);
                        joinColumn.setReferencedColumnName(localColumnName.column);
                        joinTable.getInverseJoinColumn().add(joinColumn);
                    }
                }
            }
        }
    }
}
Also used : ManyToOne(org.apache.openejb.jee.jpa.ManyToOne) RelationField(org.apache.openejb.jee.jpa.RelationField) CmpField(org.apache.openejb.jee.CmpField) Field(org.apache.openejb.jee.jpa.Field) PrimaryKeyJoinColumn(org.apache.openejb.jee.jpa.PrimaryKeyJoinColumn) OneToOne(org.apache.openejb.jee.jpa.OneToOne) JoinColumn(org.apache.openejb.jee.jpa.JoinColumn) PrimaryKeyJoinColumn(org.apache.openejb.jee.jpa.PrimaryKeyJoinColumn) Column(org.apache.openejb.jee.jpa.Column) JoinColumn(org.apache.openejb.jee.jpa.JoinColumn) PrimaryKeyJoinColumn(org.apache.openejb.jee.jpa.PrimaryKeyJoinColumn) ColumnPair(org.apache.openejb.jee.sun.ColumnPair) Table(org.apache.openejb.jee.jpa.Table) SecondaryTable(org.apache.openejb.jee.jpa.SecondaryTable) JoinTable(org.apache.openejb.jee.jpa.JoinTable) OneToMany(org.apache.openejb.jee.jpa.OneToMany) EntityMapping(org.apache.openejb.jee.sun.EntityMapping) ColumnName(org.apache.openejb.jee.sun.ColumnName) RelationField(org.apache.openejb.jee.jpa.RelationField) SecondaryTable(org.apache.openejb.jee.jpa.SecondaryTable) CmpFieldMapping(org.apache.openejb.jee.sun.CmpFieldMapping) CmrFieldMapping(org.apache.openejb.jee.sun.CmrFieldMapping) JoinTable(org.apache.openejb.jee.jpa.JoinTable)

Example 2 with ManyToOne

use of org.apache.openejb.jee.jpa.ManyToOne in project tomee by apache.

the class CmpJpaConversion method processRelationship.

private void processRelationship(final Map<String, Entity> entitiesByEjbName, final EjbRelation relation) throws OpenEJBException {
    final List<EjbRelationshipRole> roles = relation.getEjbRelationshipRole();
    // if we don't have two roles, the relation is bad so we skip it
    if (roles.size() != 2) {
        return;
    }
    // get left entity
    final EjbRelationshipRole leftRole = roles.get(0);
    final RelationshipRoleSource leftRoleSource = leftRole.getRelationshipRoleSource();
    final String leftEjbName = leftRoleSource == null ? null : leftRoleSource.getEjbName();
    final Entity leftEntity = entitiesByEjbName.get(leftEjbName);
    // get right entity
    final EjbRelationshipRole rightRole = roles.get(1);
    final RelationshipRoleSource rightRoleSource = rightRole.getRelationshipRoleSource();
    final String rightEjbName = rightRoleSource == null ? null : rightRoleSource.getEjbName();
    final Entity rightEntity = entitiesByEjbName.get(rightEjbName);
    // neither left or right have a mapping which is fine
    if (leftEntity == null && rightEntity == null) {
        return;
    }
    // left not found?
    if (leftEntity == null) {
        throw new OpenEJBException("Role source " + leftEjbName + " defined in relationship role " + relation.getEjbRelationName() + "::" + leftRole.getEjbRelationshipRoleName() + " not found");
    }
    // right not found?
    if (rightEntity == null) {
        throw new OpenEJBException("Role source " + rightEjbName + " defined in relationship role " + relation.getEjbRelationName() + "::" + rightRole.getEjbRelationshipRoleName() + " not found");
    }
    final Attributes rightAttributes = rightEntity.getAttributes();
    final Map<String, RelationField> rightRelationships = rightAttributes.getRelationshipFieldMap();
    final Attributes leftAttributes = leftEntity.getAttributes();
    final Map<String, RelationField> leftRelationships = leftAttributes.getRelationshipFieldMap();
    String leftFieldName = null;
    boolean leftSynthetic = false;
    if (leftRole.getCmrField() != null) {
        leftFieldName = leftRole.getCmrField().getCmrFieldName();
    } else {
        leftFieldName = rightEntity.getName() + "_" + rightRole.getCmrField().getCmrFieldName();
        leftSynthetic = true;
    }
    final boolean leftIsOne = leftRole.getMultiplicity() == Multiplicity.ONE;
    String rightFieldName = null;
    boolean rightSynthetic = false;
    if (rightRole.getCmrField() != null) {
        rightFieldName = rightRole.getCmrField().getCmrFieldName();
    } else {
        rightFieldName = leftEntity.getName() + "_" + leftRole.getCmrField().getCmrFieldName();
        rightSynthetic = true;
    }
    final boolean rightIsOne = rightRole.getMultiplicity() == Multiplicity.ONE;
    if (leftIsOne && rightIsOne) {
        // 
        // one-to-one
        // 
        // left
        OneToOne leftOneToOne = null;
        leftOneToOne = new OneToOne();
        leftOneToOne.setName(leftFieldName);
        leftOneToOne.setSyntheticField(leftSynthetic);
        setCascade(rightRole, leftOneToOne);
        addRelationship(leftOneToOne, leftRelationships, leftAttributes.getOneToOne());
        // right
        OneToOne rightOneToOne = null;
        rightOneToOne = new OneToOne();
        rightOneToOne.setName(rightFieldName);
        rightOneToOne.setSyntheticField(rightSynthetic);
        rightOneToOne.setMappedBy(leftFieldName);
        setCascade(leftRole, rightOneToOne);
        addRelationship(rightOneToOne, rightRelationships, rightAttributes.getOneToOne());
        // link
        leftOneToOne.setRelatedField(rightOneToOne);
        rightOneToOne.setRelatedField(leftOneToOne);
    } else if (leftIsOne && !rightIsOne) {
        // 
        // one-to-many
        // 
        // left
        OneToMany leftOneToMany = null;
        leftOneToMany = new OneToMany();
        leftOneToMany.setName(leftFieldName);
        leftOneToMany.setSyntheticField(leftSynthetic);
        leftOneToMany.setMappedBy(rightFieldName);
        setCascade(rightRole, leftOneToMany);
        addRelationship(leftOneToMany, leftRelationships, leftAttributes.getOneToMany());
        // right
        ManyToOne rightManyToOne = null;
        rightManyToOne = new ManyToOne();
        rightManyToOne.setName(rightFieldName);
        rightManyToOne.setSyntheticField(rightSynthetic);
        setCascade(leftRole, rightManyToOne);
        addRelationship(rightManyToOne, rightRelationships, rightAttributes.getManyToOne());
        // link
        leftOneToMany.setRelatedField(rightManyToOne);
        rightManyToOne.setRelatedField(leftOneToMany);
    } else if (!leftIsOne && rightIsOne) {
        // 
        // many-to-one
        // 
        // left
        ManyToOne leftManyToOne = null;
        leftManyToOne = new ManyToOne();
        leftManyToOne.setName(leftFieldName);
        leftManyToOne.setSyntheticField(leftSynthetic);
        setCascade(rightRole, leftManyToOne);
        addRelationship(leftManyToOne, leftRelationships, leftAttributes.getManyToOne());
        // right
        OneToMany rightOneToMany = null;
        rightOneToMany = new OneToMany();
        rightOneToMany.setName(rightFieldName);
        rightOneToMany.setSyntheticField(rightSynthetic);
        rightOneToMany.setMappedBy(leftFieldName);
        setCascade(leftRole, rightOneToMany);
        addRelationship(rightOneToMany, rightRelationships, rightAttributes.getOneToMany());
        // link
        leftManyToOne.setRelatedField(rightOneToMany);
        rightOneToMany.setRelatedField(leftManyToOne);
    } else if (!leftIsOne && !rightIsOne) {
        // 
        // many-to-many
        // 
        // left
        ManyToMany leftManyToMany = null;
        leftManyToMany = new ManyToMany();
        leftManyToMany.setName(leftFieldName);
        leftManyToMany.setSyntheticField(leftSynthetic);
        setCascade(rightRole, leftManyToMany);
        addRelationship(leftManyToMany, leftRelationships, leftAttributes.getManyToMany());
        // right
        ManyToMany rightManyToMany = null;
        rightManyToMany = new ManyToMany();
        rightManyToMany.setName(rightFieldName);
        rightManyToMany.setSyntheticField(rightSynthetic);
        rightManyToMany.setMappedBy(leftFieldName);
        setCascade(leftRole, rightManyToMany);
        addRelationship(rightManyToMany, rightRelationships, rightAttributes.getManyToMany());
        // link
        leftManyToMany.setRelatedField(rightManyToMany);
        rightManyToMany.setRelatedField(leftManyToMany);
    }
}
Also used : Entity(org.apache.openejb.jee.jpa.Entity) OpenEJBException(org.apache.openejb.OpenEJBException) Attributes(org.apache.openejb.jee.jpa.Attributes) ManyToMany(org.apache.openejb.jee.jpa.ManyToMany) OneToMany(org.apache.openejb.jee.jpa.OneToMany) ManyToOne(org.apache.openejb.jee.jpa.ManyToOne) RelationField(org.apache.openejb.jee.jpa.RelationField) OneToOne(org.apache.openejb.jee.jpa.OneToOne) RelationshipRoleSource(org.apache.openejb.jee.RelationshipRoleSource) EjbRelationshipRole(org.apache.openejb.jee.EjbRelationshipRole)

Aggregations

ManyToOne (org.apache.openejb.jee.jpa.ManyToOne)2 OneToMany (org.apache.openejb.jee.jpa.OneToMany)2 OneToOne (org.apache.openejb.jee.jpa.OneToOne)2 RelationField (org.apache.openejb.jee.jpa.RelationField)2 OpenEJBException (org.apache.openejb.OpenEJBException)1 CmpField (org.apache.openejb.jee.CmpField)1 EjbRelationshipRole (org.apache.openejb.jee.EjbRelationshipRole)1 RelationshipRoleSource (org.apache.openejb.jee.RelationshipRoleSource)1 Attributes (org.apache.openejb.jee.jpa.Attributes)1 Column (org.apache.openejb.jee.jpa.Column)1 Entity (org.apache.openejb.jee.jpa.Entity)1 Field (org.apache.openejb.jee.jpa.Field)1 JoinColumn (org.apache.openejb.jee.jpa.JoinColumn)1 JoinTable (org.apache.openejb.jee.jpa.JoinTable)1 ManyToMany (org.apache.openejb.jee.jpa.ManyToMany)1 PrimaryKeyJoinColumn (org.apache.openejb.jee.jpa.PrimaryKeyJoinColumn)1 SecondaryTable (org.apache.openejb.jee.jpa.SecondaryTable)1 Table (org.apache.openejb.jee.jpa.Table)1 CmpFieldMapping (org.apache.openejb.jee.sun.CmpFieldMapping)1 CmrFieldMapping (org.apache.openejb.jee.sun.CmrFieldMapping)1