Search in sources :

Example 1 with JoinTable

use of org.apache.openejb.jee.jpa.JoinTable 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 JoinTable

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

the class OpenEjb2Conversion method mergeEntityMappings.

public final void mergeEntityMappings(final String moduleId, final EntityMappings entityMappings, final OpenejbJar openejbJar, final OpenejbJarType openejbJarType) {
    final Map<String, EntityData> entities = new TreeMap<>();
    if (entityMappings != null) {
        for (final Entity entity : entityMappings.getEntity()) {
            try {
                entities.put(entity.getDescription(), new EntityData(entity));
            } catch (final IllegalArgumentException e) {
                LoggerFactory.getLogger(this.getClass()).error(e.getMessage(), e);
            }
        }
    }
    for (final org.apache.openejb.jee.oejb2.EnterpriseBean enterpriseBean : openejbJarType.getEnterpriseBeans()) {
        if (!(enterpriseBean instanceof EntityBeanType)) {
            continue;
        }
        final EntityBeanType bean = (EntityBeanType) enterpriseBean;
        final 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.setName(bean.getTableName());
        entityData.entity.setTable(table);
        for (final EntityBeanType.CmpFieldMapping cmpFieldMapping : bean.getCmpFieldMapping()) {
            final String cmpFieldName = cmpFieldMapping.getCmpFieldName();
            final Field field = entityData.fields.get(cmpFieldName);
            if (field == null) {
                // todo warn no such cmp-field in the ejb-jar.xml
                continue;
            }
            final Column column = new Column();
            column.setName(cmpFieldMapping.getTableColumn());
            field.setColumn(column);
        }
        if (bean.getKeyGenerator() != null) {
            // todo support complex primary keys
            final Attributes attributes = entityData.entity.getAttributes();
            if (attributes != null && attributes.getId().size() == 1) {
                final Id id = attributes.getId().get(0);
                // todo detect specific generation strategy
                id.setGeneratedValue(new GeneratedValue(GenerationType.IDENTITY));
            }
        }
        for (final QueryType query : bean.getQuery()) {
            final NamedQuery namedQuery = new NamedQuery();
            final QueryType.QueryMethod queryMethod = query.getQueryMethod();
            // todo deployment id could change in one of the later conversions... use entity name instead, but we need to save it off
            final StringBuilder name = new StringBuilder();
            name.append(entityData.entity.getName()).append(".").append(queryMethod.getMethodName());
            if (queryMethod.getMethodParams() != null && !queryMethod.getMethodParams().getMethodParam().isEmpty()) {
                name.append('(');
                boolean first = true;
                for (final String methodParam : queryMethod.getMethodParams().getMethodParam()) {
                    if (!first) {
                        name.append(",");
                    }
                    name.append(methodParam);
                    first = false;
                }
                name.append(')');
            }
            namedQuery.setName(name.toString());
            namedQuery.setQuery(query.getEjbQl());
            entityData.entity.getNamedQuery().add(namedQuery);
        }
    }
    for (final EjbRelationType relation : openejbJarType.getEjbRelation()) {
        final List<EjbRelationshipRoleType> roles = relation.getEjbRelationshipRole();
        if (roles.isEmpty()) {
            continue;
        }
        if (relation.getManyToManyTableName() == null) {
            final EjbRelationshipRoleType leftRole = roles.get(0);
            final EjbRelationshipRoleType.RelationshipRoleSource leftRoleSource = leftRole.getRelationshipRoleSource();
            final String leftEjbName = leftRoleSource == null ? null : leftRoleSource.getEjbName();
            final EntityData leftEntityData = entities.get(moduleId + "#" + leftEjbName);
            final EjbRelationshipRoleType.CmrField cmrField = leftRole.getCmrField();
            final String leftFieldName = null != cmrField ? cmrField.getCmrFieldName() : null;
            RelationField field;
            if (leftRole.isForeignKeyColumnOnSource()) {
                field = null != leftFieldName && null != leftEntityData ? leftEntityData.relations.get(leftFieldName) : null;
                // todo warn field not found
                if (field == null) {
                    continue;
                }
            } else {
                final RelationField other = null != leftFieldName && null != leftEntityData ? leftEntityData.relations.get(leftFieldName) : null;
                // todo warn field not found
                if (other == null) {
                    continue;
                }
                field = other.getRelatedField();
                // todo warn field not found
                if (field == null) {
                    if (other instanceof OneToMany) {
                        // for a unidirectional oneToMany, the join column declaration
                        // is placed on the oneToMany element instead of manyToOne
                        field = other;
                    } else {
                        continue;
                    }
                }
            }
            // is marked as the owning field
            if (field instanceof OneToOne) {
                final OneToOne left = (OneToOne) field;
                final OneToOne right = (OneToOne) left.getRelatedField();
                if (right != null) {
                    left.setMappedBy(null);
                    right.setMappedBy(left.getName());
                }
            }
            final EjbRelationshipRoleType.RoleMapping roleMapping = leftRole.getRoleMapping();
            for (final EjbRelationshipRoleType.RoleMapping.CmrFieldMapping cmrFieldMapping : roleMapping.getCmrFieldMapping()) {
                final JoinColumn joinColumn = new JoinColumn();
                joinColumn.setName(cmrFieldMapping.getForeignKeyColumn());
                joinColumn.setReferencedColumnName(cmrFieldMapping.getKeyColumn());
                field.getJoinColumn().add(joinColumn);
            }
        } else {
            final JoinTable joinTable = new JoinTable();
            joinTable.setName(relation.getManyToManyTableName());
            // 
            // left
            final EjbRelationshipRoleType leftRole = roles.get(0);
            RelationField left = null;
            if (leftRole.getRelationshipRoleSource() != null) {
                final String leftEjbName = leftRole.getRelationshipRoleSource().getEjbName();
                final EntityData leftEntityData = entities.get(moduleId + "#" + leftEjbName);
                if (leftEntityData == null) {
                    // todo warn no such entity in ejb-jar.xml
                    continue;
                }
                final EjbRelationshipRoleType.CmrField lcf = leftRole.getCmrField();
                left = (null != lcf ? leftEntityData.relations.get(lcf.getCmrFieldName()) : null);
            }
            if (left != null) {
                left.setJoinTable(joinTable);
                final EjbRelationshipRoleType.RoleMapping roleMapping = leftRole.getRoleMapping();
                for (final EjbRelationshipRoleType.RoleMapping.CmrFieldMapping cmrFieldMapping : roleMapping.getCmrFieldMapping()) {
                    final JoinColumn joinColumn = new JoinColumn();
                    joinColumn.setName(cmrFieldMapping.getForeignKeyColumn());
                    joinColumn.setReferencedColumnName(cmrFieldMapping.getKeyColumn());
                    joinTable.getJoinColumn().add(joinColumn);
                }
            }
            // right
            if (roles.size() > 1) {
                final EjbRelationshipRoleType rightRole = roles.get(1);
                // if there wasn't a left cmr field, find the field for the right, so we can add the join table to it
                if (left == null) {
                    final EjbRelationshipRoleType.CmrField rcf = rightRole.getCmrField();
                    if (rcf == null) {
                        // todo warn no cmr field declared for either role
                        continue;
                    } else if (rightRole.getRelationshipRoleSource() != null) {
                        final String rightEjbName = rightRole.getRelationshipRoleSource().getEjbName();
                        final EntityData rightEntityData = entities.get(moduleId + "#" + rightEjbName);
                        if (rightEntityData == null) {
                            // todo warn no such entity in ejb-jar.xml
                            continue;
                        }
                        final RelationField right = rightEntityData.relations.get(rcf.getCmrFieldName());
                        right.setJoinTable(joinTable);
                    }
                }
                final EjbRelationshipRoleType.RoleMapping roleMapping = rightRole.getRoleMapping();
                for (final EjbRelationshipRoleType.RoleMapping.CmrFieldMapping cmrFieldMapping : roleMapping.getCmrFieldMapping()) {
                    final JoinColumn joinColumn = new JoinColumn();
                    joinColumn.setName(cmrFieldMapping.getForeignKeyColumn());
                    joinColumn.setReferencedColumnName(cmrFieldMapping.getKeyColumn());
                    joinTable.getInverseJoinColumn().add(joinColumn);
                }
            }
        }
    }
}
Also used : Entity(org.apache.openejb.jee.jpa.Entity) Attributes(org.apache.openejb.jee.jpa.Attributes) EjbRelationshipRoleType(org.apache.openejb.jee.oejb2.EjbRelationshipRoleType) GeneratedValue(org.apache.openejb.jee.jpa.GeneratedValue) RelationField(org.apache.openejb.jee.jpa.RelationField) Field(org.apache.openejb.jee.jpa.Field) OneToOne(org.apache.openejb.jee.jpa.OneToOne) JoinColumn(org.apache.openejb.jee.jpa.JoinColumn) Column(org.apache.openejb.jee.jpa.Column) JoinColumn(org.apache.openejb.jee.jpa.JoinColumn) Table(org.apache.openejb.jee.jpa.Table) JoinTable(org.apache.openejb.jee.jpa.JoinTable) TreeMap(java.util.TreeMap) OneToMany(org.apache.openejb.jee.jpa.OneToMany) EjbRelationType(org.apache.openejb.jee.oejb2.EjbRelationType) RelationField(org.apache.openejb.jee.jpa.RelationField) EntityBeanType(org.apache.openejb.jee.oejb2.EntityBeanType) Id(org.apache.openejb.jee.jpa.Id) NamedQuery(org.apache.openejb.jee.jpa.NamedQuery) QueryType(org.apache.openejb.jee.oejb2.QueryType) JoinTable(org.apache.openejb.jee.jpa.JoinTable)

Aggregations

Column (org.apache.openejb.jee.jpa.Column)2 Field (org.apache.openejb.jee.jpa.Field)2 JoinColumn (org.apache.openejb.jee.jpa.JoinColumn)2 JoinTable (org.apache.openejb.jee.jpa.JoinTable)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 Table (org.apache.openejb.jee.jpa.Table)2 TreeMap (java.util.TreeMap)1 CmpField (org.apache.openejb.jee.CmpField)1 Attributes (org.apache.openejb.jee.jpa.Attributes)1 Entity (org.apache.openejb.jee.jpa.Entity)1 GeneratedValue (org.apache.openejb.jee.jpa.GeneratedValue)1 Id (org.apache.openejb.jee.jpa.Id)1 ManyToOne (org.apache.openejb.jee.jpa.ManyToOne)1 NamedQuery (org.apache.openejb.jee.jpa.NamedQuery)1 PrimaryKeyJoinColumn (org.apache.openejb.jee.jpa.PrimaryKeyJoinColumn)1 SecondaryTable (org.apache.openejb.jee.jpa.SecondaryTable)1 EjbRelationType (org.apache.openejb.jee.oejb2.EjbRelationType)1 EjbRelationshipRoleType (org.apache.openejb.jee.oejb2.EjbRelationshipRoleType)1