use of org.apache.openejb.jee.jpa.RelationField 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);
}
}
}
}
}
}
use of org.apache.openejb.jee.jpa.RelationField 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);
}
}
use of org.apache.openejb.jee.jpa.RelationField 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);
}
}
}
}
}
Aggregations