You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2015/01/19 15:26:33 UTC
[1/3] cayenne git commit: hot fix for many-to-many relationships
revers engineering
Repository: cayenne
Updated Branches:
refs/heads/master c8ff4355f -> 3b619d4e0
hot fix for many-to-many relationships revers engineering
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/54997aa6
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/54997aa6
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/54997aa6
Branch: refs/heads/master
Commit: 54997aa6dcad98a3c297faf9eec936c198ef6fa8
Parents: 44642ea
Author: alexkolonitsky <Al...@gmail.com>
Authored: Fri Jan 16 14:04:29 2015 +0300
Committer: alexkolonitsky <Al...@gmail.com>
Committed: Fri Jan 16 14:04:29 2015 +0300
----------------------------------------------------------------------
.../org/apache/cayenne/access/DbLoader.java | 87 +++++++++++++-------
.../loader/ManyToManyCandidateEntity.java | 2 +-
.../org/apache/cayenne/map/DbRelationship.java | 13 +++
.../org/apache/cayenne/map/Relationship.java | 7 +-
.../java/org/apache/cayenne/merge/DbMerger.java | 2 +-
.../apache/cayenne/util/EntityMergeSupport.java | 52 ++++++++----
.../org/apache/cayenne/map/DataMapTest.java | 6 +-
.../java/org/apache/cayenne/map/DbEntityIT.java | 4 +-
.../apache/cayenne/map/DbRelationshipIT.java | 4 +-
.../apache/cayenne/map/ObjRelationshipIT.java | 14 ++--
.../apache/cayenne/map/RelationshipTest.java | 2 +-
.../cayenne/merge/DropColumnToModelIT.java | 8 +-
.../merge/DropRelationshipToModelIT.java | 15 ++--
.../apache/cayenne/merge/MergerFactoryIT.java | 21 +++--
.../cayenne/util/EntityMergeSupportIT.java | 4 +-
.../cayenne/tools/dbimport/DbImportAction.java | 46 ++++++-----
.../tools/dbimport/DbImportConfiguration.java | 12 ++-
.../dialog/ResolveDbRelationshipDialog.java | 2 +-
.../InferRelationshipsController.java | 2 +-
.../dialog/objentity/ObjRelationshipInfo.java | 4 +-
.../editor/ObjRelationshipTableModel.java | 2 +-
.../dbentity/DbRelationshipTableModel.java | 2 +-
.../cayenne/wocompat/EOModelProcessor.java | 4 +-
.../dbimport/testUnFlattensManyToMany.map.xml | 8 +-
.../testUnFlattensManyToMany.map.xml-result | 36 +++++++-
.../tools/dbimport/testUnFlattensManyToMany.sql | 22 +++++
26 files changed, 256 insertions(+), 125 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
index 864e4f0..07b674c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DbLoader.java
@@ -445,7 +445,15 @@ public class DbLoader {
/**
* Creates an ObjEntity for each DbEntity in the map.
*/
- protected Collection<ObjEntity> loadObjEntities(DataMap map, DbLoaderConfiguration config, Collection<DbEntity> entities) {
+ public Collection<ObjEntity> loadObjEntities(DataMap map, DbLoaderConfiguration config, Collection<DbEntity> entities) {
+ Collection<ObjEntity> loadedEntities = DbLoader.loadObjEntities(map, config, entities, nameGenerator);
+
+ createEntityMerger(map).synchronizeWithDbEntities(loadedEntities);
+
+ return loadedEntities;
+ }
+
+ public static Collection<ObjEntity> loadObjEntities(DataMap map, DbLoaderConfiguration config, Collection<DbEntity> entities, ObjectNameGenerator nameGenerator) {
if (entities.isEmpty()) {
return Collections.emptyList();
}
@@ -477,9 +485,6 @@ public class DbLoader {
loadedEntities.add(objEntity);
}
- // update ObjEntity attributes and relationships
- createEntityMerger(map).synchronizeWithDbEntities(loadedEntities);
-
return loadedEntities;
}
@@ -491,6 +496,10 @@ public class DbLoader {
}
protected void loadDbRelationships(DbLoaderConfiguration config, Map<DbPath, Map<String, DbEntity>> tables) throws SQLException {
+ if (config.isSkipRelationshipsLoading()) {
+ return;
+ }
+
// Get all the foreign keys referencing this table
for (Map.Entry<DbPath, Map<String, DbEntity>> pathEntry : tables.entrySet()) {
@@ -518,28 +527,31 @@ public class DbLoader {
continue;
}
+ // forwardRelationship is a reference from table with primary key
DbRelationship forwardRelationship = new DbRelationship(generateName(pkEntity, key, true));
forwardRelationship.setSourceEntity(pkEntity);
- forwardRelationship.setTargetEntity(fkEntity);
+ forwardRelationship.setTargetEntityName(fkEntity);
+ // forwardRelationship is a reference from table with foreign key, it is what exactly we load from db
DbRelationshipDetected reverseRelationship = new DbRelationshipDetected(generateName(fkEntity, key, false));
reverseRelationship.setFkName(key.getFKName());
reverseRelationship.setSourceEntity(fkEntity);
- reverseRelationship.setTargetEntity(pkEntity);
+ reverseRelationship.setTargetEntityName(pkEntity);
reverseRelationship.setToMany(false);
- if (delegate.dbRelationshipLoaded(fkEntity, reverseRelationship)) {
- fkEntity.addRelationship(reverseRelationship);
- }
- boolean toPK = createAndAppendJoins(exportedKeys, pkEntity, fkEntity, forwardRelationship, reverseRelationship);
+ createAndAppendJoins(exportedKeys, pkEntity, fkEntity, forwardRelationship, reverseRelationship);
- forwardRelationship.setToDependentPK(toPK);
+ boolean toDependentPK = isToDependentPK(forwardRelationship);
+ forwardRelationship.setToDependentPK(toDependentPK);
- boolean isOneToOne = toPK && fkEntity.getPrimaryKeys().size()
- == forwardRelationship.getJoins().size();
+ boolean isOneToOne = toDependentPK && fkEntity.getPrimaryKeys().size() == forwardRelationship.getJoins().size();
forwardRelationship.setToMany(!isOneToOne);
forwardRelationship.setName(generateName(pkEntity, key, !isOneToOne));
+
+ if (delegate.dbRelationshipLoaded(fkEntity, reverseRelationship)) {
+ fkEntity.addRelationship(reverseRelationship);
+ }
if (delegate.dbRelationshipLoaded(pkEntity, forwardRelationship)) {
pkEntity.addRelationship(forwardRelationship);
}
@@ -547,8 +559,17 @@ public class DbLoader {
}
}
- private boolean createAndAppendJoins(Set<ExportedKey> exportedKeys, DbEntity pkEntity, DbEntity fkEntity, DbRelationship forwardRelationship, DbRelationshipDetected reverseRelationship) {
- boolean toPK = true;
+ private boolean isToDependentPK(DbRelationship forwardRelationship) {
+ for (DbJoin dbJoin : forwardRelationship.getJoins()) {
+ if (!dbJoin.getTarget().isPrimaryKey()) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private void createAndAppendJoins(Set<ExportedKey> exportedKeys, DbEntity pkEntity, DbEntity fkEntity, DbRelationship forwardRelationship, DbRelationshipDetected reverseRelationship) {
for (ExportedKey exportedKey : exportedKeys) {
// Create and append joins
String pkName = exportedKey.getPKColumnName();
@@ -569,12 +590,7 @@ public class DbLoader {
forwardRelationship.addJoin(new DbJoin(forwardRelationship, pkName, fkName));
reverseRelationship.addJoin(new DbJoin(reverseRelationship, fkName, pkName));
-
- if (!pkAtt.isPrimaryKey()) {
- toPK = false;
- }
}
- return toPK;
}
private Map<String, Set<ExportedKey>> loadExportedKeys(DbLoaderConfiguration config, DbPath dbPath, Map<String, DbEntity> tables) throws SQLException {
@@ -648,14 +664,17 @@ public class DbLoader {
/**
* Flattens many-to-many relationships in the generated model.
*/
- private void flattenManyToManyRelationships(DataMap map, Collection<ObjEntity> loadedObjEntities) {
+ public static void flattenManyToManyRelationships(DataMap map, Collection<ObjEntity> loadedObjEntities, ObjectNameGenerator objectNameGenerator) {
+ if (loadedObjEntities.isEmpty()) {
+ return;
+ }
Collection<ObjEntity> entitiesForDelete = new LinkedList<ObjEntity>();
- for (ObjEntity curEntity : map.getObjEntities()) {
+ for (ObjEntity curEntity : loadedObjEntities) {
ManyToManyCandidateEntity entity = ManyToManyCandidateEntity.build(curEntity);
if (entity != null) {
- entity.optimizeRelationships(getNameGenerator());
+ entity.optimizeRelationships(objectNameGenerator);
entitiesForDelete.add(curEntity);
}
}
@@ -760,21 +779,24 @@ public class DbLoader {
* @since 4.0
*/
public void load(DataMap dataMap, DbLoaderConfiguration config) throws SQLException {
+ LOGGER.info("Schema loading...");
Map<DbPath, Map<String, DbEntity>> tables = getTables(config, config.getTableTypes());
List<DbEntity> entities = loadDbEntities(dataMap, config, tables);
if (entities != null) {
- if (!config.isSkipRelationshipsLoading()) {
- loadDbRelationships(config, tables);
- }
+ loadDbRelationships(config, tables);
- Collection<ObjEntity> loadedObjEntities = loadObjEntities(dataMap, config, entities);
- flattenManyToManyRelationships(dataMap, loadedObjEntities);
- fireObjEntitiesAddedEvents(loadedObjEntities);
+ prepareObjLayer(dataMap, config, entities);
}
}
+ public void prepareObjLayer(DataMap dataMap, DbLoaderConfiguration config, Collection<DbEntity> entities) {
+ Collection<ObjEntity> loadedObjEntities = loadObjEntities(dataMap, config, entities);
+ flattenManyToManyRelationships(dataMap, loadedObjEntities, getNameGenerator());
+ fireObjEntitiesAddedEvents(loadedObjEntities);
+ }
+
/**
* Performs database reverse engineering to match the specified catalog,
* schema, table name and table type patterns and fills the specified
@@ -982,10 +1004,11 @@ public class DbLoader {
*/
public void setNameGenerator(ObjectNameGenerator strategy) {
if (strategy == null) {
- throw new NullPointerException("Null strategy not allowed");
+ LOGGER.warn("Attempt to set null into NameGenerator. LegacyNameGenerator will be used.");
+ this.nameGenerator = new LegacyNameGenerator();
+ } else {
+ this.nameGenerator = strategy;
}
-
- this.nameGenerator = strategy;
}
/**
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/main/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntity.java
index ef8391d..e51d936 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntity.java
@@ -117,7 +117,7 @@ public class ManyToManyCandidateEntity {
nameGenerator.createDbRelationshipName(key, true)));
newRelationship.setSourceEntity(srcEntity);
- newRelationship.setTargetEntity(dstEntity);
+ newRelationship.setTargetEntityName(dstEntity);
newRelationship.addDbRelationship(rel1);
newRelationship.addDbRelationship(rel2);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
index 5234ff4..cee22e8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
@@ -535,4 +535,17 @@ public class DbRelationship extends Relationship implements ConfigurationNode {
&& Util.nullSafeEquals(j.targetName, this.targetName);
}
}
+
+ public String toString() {
+ StringBuilder res = new StringBuilder("Db Relationship : ");
+ res.append(toMany ? "toMany" : "toOne ");
+
+ String sourceEntityName = getSourceEntity().getName();
+ for (DbJoin join : joins) {
+ res.append(" (").append(sourceEntityName).append(".").append(join.getSourceName()).append(", ")
+ .append(targetEntityName).append(".").append(join.getTargetName()).append(")");
+ }
+ return res.toString();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
index 1c34172..3aadbfc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
@@ -91,12 +91,11 @@ public abstract class Relationship implements CayenneMapEntry, XMLSerializable,
/**
* Sets relationship target entity. Internally calls <code>setTargetEntityName</code>.
*/
- public void setTargetEntity(Entity targetEntity) {
+ public void setTargetEntityName(Entity targetEntity) {
if (targetEntity != null) {
setTargetEntityName(targetEntity.getName());
- }
- else {
- setTargetEntityName(null);
+ } else {
+ setTargetEntityName((String) null);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
index e537b8a..c5b9547 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java
@@ -251,7 +251,7 @@ public class DbMerger {
}
detected.setSourceEntity(dbEntity);
- detected.setTargetEntity(targetEntity);
+ detected.setTargetEntityName(targetEntity);
// manipulate the joins to match the DbAttributes in the model
for (DbJoin join : detected.getJoins()) {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
index 9772794..9b26239 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java
@@ -40,12 +40,16 @@ import org.apache.cayenne.map.naming.LegacyNameGenerator;
import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
import org.apache.cayenne.map.naming.NameCheckers;
import org.apache.cayenne.map.naming.ObjectNameGenerator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
* Implements methods for entity merging.
*/
public class EntityMergeSupport {
+ private static final Log LOG = LogFactory.getLog(EntityMergeSupport.class);
+
private static final Map<String, String> CLASS_TO_PRIMITIVE;
static {
@@ -162,27 +166,43 @@ public class EntityMergeSupport {
}
private boolean addMissingRelationships(ObjEntity entity) {
- boolean changed = false;
- for (DbRelationship dr : getRelationshipsToAdd(entity)) {
- DbEntity targetEntity = dr.getTargetEntity();
-
- for (Entity mappedTarget : map.getMappedEntities(targetEntity)) {
+ List<DbRelationship> relationshipsToAdd = getRelationshipsToAdd(entity);
+ if (relationshipsToAdd.isEmpty()) {
+ return false;
+ }
- // avoid duplicate names
- String relationshipName = nameGenerator.createObjRelationshipName(dr);
- relationshipName = DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName);
+ for (DbRelationship dr : relationshipsToAdd) {
+ DbEntity targetEntity = dr.getTargetEntity();
- ObjRelationship or = new ObjRelationship(relationshipName);
- or.addDbRelationship(dr);
- or.setSourceEntity(entity);
- or.setTargetEntity(mappedTarget);
- entity.addRelationship(or);
+ Collection<ObjEntity> mappedObjEntities = map.getMappedEntities(targetEntity);
+ if (!mappedObjEntities.isEmpty()) {
+ for (Entity mappedTarget : mappedObjEntities) {
+ createObjRelationship(entity, dr, mappedTarget.getName());
+ }
+ } else {
+ LOG.warn("Can't find ObjEntity for " + dr.getTargetEntityName());
+ LOG.warn("Db Relationship (" + dr + ") will have GUESSED Obj Relationship reflection. ");
- fireRelationshipAdded(or);
- changed = true;
+ if (targetEntity == null) {
+ targetEntity = new DbEntity(dr.getTargetEntityName());
+ }
+ createObjRelationship(entity, dr, nameGenerator.createObjEntityName(targetEntity));
}
}
- return changed;
+ return true;
+ }
+
+ private void createObjRelationship(ObjEntity entity, DbRelationship dr, String targetEntityName) {
+ String relationshipName = nameGenerator.createObjRelationshipName(dr);
+ relationshipName = DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName);
+
+ ObjRelationship or = new ObjRelationship(relationshipName);
+ or.addDbRelationship(dr);
+ or.setSourceEntity(entity);
+ or.setTargetEntityName(targetEntityName);
+ entity.addRelationship(or);
+
+ fireRelationshipAdded(or);
}
private boolean addMissingAttributes(ObjEntity entity) {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
index a64b830..d663c70 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
@@ -350,15 +350,15 @@ public class DataMapTest {
DbRelationship r1 = new DbRelationship();
r1.setName("r1");
- r1.setTargetEntity(e2);
+ r1.setTargetEntityName(e2);
DbRelationship r2 = new DbRelationship();
r2.setName("r2");
- r2.setTargetEntity(e1);
+ r2.setTargetEntityName(e1);
DbRelationship r3 = new DbRelationship();
r3.setName("r3");
- r3.setTargetEntity(e2);
+ r3.setTargetEntityName(e2);
e1.addRelationship(r1);
e1.addRelationship(r2);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityIT.java
index ab63608..41b7c03 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/DbEntityIT.java
@@ -207,12 +207,12 @@ public class DbEntityIT extends ServerCase {
DbRelationship rel = new DbRelationship("relfrom");
ent.addRelationship(rel);
- rel.setTargetEntity(otherEntity);
+ rel.setTargetEntityName(otherEntity);
rel.addJoin(new DbJoin(rel, "a1", "a11"));
DbRelationship rel1 = new DbRelationship("relto");
otherEntity.addRelationship(rel1);
- rel1.setTargetEntity(ent);
+ rel1.setTargetEntityName(ent);
rel1.addJoin(new DbJoin(rel1, "a11", "a1"));
// check that the test case is working
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java
index c8d442a..4526fb9 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/DbRelationshipIT.java
@@ -93,7 +93,7 @@ public class DbRelationshipIT extends ServerCase {
DbRelationship rforward = new DbRelationship("rforward");
e.addRelationship(rforward);
rforward.setSourceEntity(e);
- rforward.setTargetEntity(e);
+ rforward.setTargetEntityName(e);
assertNull(rforward.getReverseRelationship());
@@ -109,7 +109,7 @@ public class DbRelationshipIT extends ServerCase {
DbRelationship rback = new DbRelationship("rback");
e.addRelationship(rback);
rback.setSourceEntity(e);
- rback.setTargetEntity(e);
+ rback.setTargetEntityName(e);
assertNull(rforward.getReverseRelationship());
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
index bf9f9e1..34da87d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
@@ -391,11 +391,11 @@ public class ObjRelationshipIT extends ServerCase {
DbRelationship r2 = new DbRelationship("Y");
r1.setSourceEntity(artistDBEntity);
- r1.setTargetEntity(artistExhibitDBEntity);
+ r1.setTargetEntityName(artistExhibitDBEntity);
r1.setToMany(true);
r2.setSourceEntity(artistExhibitDBEntity);
- r2.setTargetEntity(exhibitDBEntity);
+ r2.setTargetEntityName(exhibitDBEntity);
r2.setToMany(false);
ObjRelationship relationship = new ObjRelationship();
@@ -444,13 +444,13 @@ public class ObjRelationshipIT extends ServerCase {
DbRelationship r3 = new DbRelationship("Z");
r1.setSourceEntity(artistDBEntity);
- r1.setTargetEntity(artistExhibitDBEntity);
+ r1.setTargetEntityName(artistExhibitDBEntity);
r1.setToMany(true);
r2.setSourceEntity(artistExhibitDBEntity);
- r2.setTargetEntity(exhibitDBEntity);
+ r2.setTargetEntityName(exhibitDBEntity);
r2.setToMany(false);
r3.setSourceEntity(exhibitDBEntity);
- r3.setTargetEntity(galleryDBEntity);
+ r3.setTargetEntityName(galleryDBEntity);
r3.setToMany(false);
ObjRelationship relationship = new ObjRelationship();
@@ -473,10 +473,10 @@ public class ObjRelationshipIT extends ServerCase {
DbRelationship r2 = new DbRelationship("Y");
r1.setSourceEntity(artistDBEntity);
- r1.setTargetEntity(paintingDbEntity);
+ r1.setTargetEntityName(paintingDbEntity);
r1.setToMany(true);
r2.setSourceEntity(paintingDbEntity);
- r2.setTargetEntity(galleryDBEntity);
+ r2.setTargetEntityName(galleryDBEntity);
r2.setToMany(false);
ObjRelationship relationship = new ObjRelationship();
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/map/RelationshipTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/RelationshipTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/RelationshipTest.java
index e6c75ba..265bcac 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/RelationshipTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/RelationshipTest.java
@@ -48,7 +48,7 @@ public class RelationshipTest {
Relationship rel = new MockRelationship();
Entity tstEntity = new MockEntity();
tstEntity.setName("abc");
- rel.setTargetEntity(tstEntity);
+ rel.setTargetEntityName(tstEntity);
assertSame("abc", rel.getTargetEntityName());
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/merge/DropColumnToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/merge/DropColumnToModelIT.java b/cayenne-server/src/test/java/org/apache/cayenne/merge/DropColumnToModelIT.java
index 9bfee73..9005e79 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/merge/DropColumnToModelIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/merge/DropColumnToModelIT.java
@@ -140,13 +140,13 @@ public class DropColumnToModelIT extends MergeCase {
// create db relationships, but do not sync them to db
DbRelationship rel1To2 = new DbRelationship("rel1To2");
rel1To2.setSourceEntity(dbEntity1);
- rel1To2.setTargetEntity(dbEntity2);
+ rel1To2.setTargetEntityName(dbEntity2);
rel1To2.setToMany(true);
rel1To2.addJoin(new DbJoin(rel1To2, e1col1.getName(), e2col2.getName()));
dbEntity1.addRelationship(rel1To2);
DbRelationship rel2To1 = new DbRelationship("rel2To1");
rel2To1.setSourceEntity(dbEntity2);
- rel2To1.setTargetEntity(dbEntity1);
+ rel2To1.setTargetEntityName(dbEntity1);
rel2To1.setToMany(false);
rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
dbEntity2.addRelationship(rel2To1);
@@ -175,12 +175,12 @@ public class DropColumnToModelIT extends MergeCase {
ObjRelationship objRel1To2 = new ObjRelationship("objRel1To2");
objRel1To2.addDbRelationship(rel1To2);
objRel1To2.setSourceEntity(objEntity1);
- objRel1To2.setTargetEntity(objEntity2);
+ objRel1To2.setTargetEntityName(objEntity2);
objEntity1.addRelationship(objRel1To2);
ObjRelationship objRel2To1 = new ObjRelationship("objRel2To1");
objRel2To1.addDbRelationship(rel2To1);
objRel2To1.setSourceEntity(objEntity2);
- objRel2To1.setTargetEntity(objEntity1);
+ objRel2To1.setTargetEntityName(objEntity1);
objEntity2.addRelationship(objRel2To1);
assertEquals(1, objEntity1.getRelationships().size());
assertEquals(1, objEntity2.getRelationships().size());
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/merge/DropRelationshipToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/merge/DropRelationshipToModelIT.java b/cayenne-server/src/test/java/org/apache/cayenne/merge/DropRelationshipToModelIT.java
index e235109..4610fcd 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/merge/DropRelationshipToModelIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/merge/DropRelationshipToModelIT.java
@@ -75,13 +75,13 @@ public class DropRelationshipToModelIT extends MergeCase {
// create db relationships
DbRelationship rel1To2 = new DbRelationship("rel1To2");
rel1To2.setSourceEntity(dbEntity1);
- rel1To2.setTargetEntity(dbEntity2);
+ rel1To2.setTargetEntityName(dbEntity2);
rel1To2.setToMany(true);
rel1To2.addJoin(new DbJoin(rel1To2, e1col1.getName(), e2col2.getName()));
dbEntity1.addRelationship(rel1To2);
DbRelationship rel2To1 = new DbRelationship("rel2To1");
rel2To1.setSourceEntity(dbEntity2);
- rel2To1.setTargetEntity(dbEntity1);
+ rel2To1.setTargetEntityName(dbEntity1);
rel2To1.setToMany(false);
rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
dbEntity2.addRelationship(rel2To1);
@@ -113,12 +113,12 @@ public class DropRelationshipToModelIT extends MergeCase {
ObjRelationship objRel1To2 = new ObjRelationship("objRel1To2");
objRel1To2.addDbRelationship(rel1To2);
objRel1To2.setSourceEntity(objEntity1);
- objRel1To2.setTargetEntity(objEntity2);
+ objRel1To2.setTargetEntityName(objEntity2);
objEntity1.addRelationship(objRel1To2);
ObjRelationship objRel2To1 = new ObjRelationship("objRel2To1");
objRel2To1.addDbRelationship(rel2To1);
objRel2To1.setSourceEntity(objEntity2);
- objRel2To1.setTargetEntity(objEntity1);
+ objRel2To1.setTargetEntityName(objEntity1);
objEntity2.addRelationship(objRel2To1);
assertEquals(1, objEntity1.getRelationships().size());
assertEquals(1, objEntity2.getRelationships().size());
@@ -130,7 +130,12 @@ public class DropRelationshipToModelIT extends MergeCase {
dbEntity1.removeRelationship(rel1To2.getName());
dbEntity2.removeAttribute(e2col2.getName());
List<MergerToken> tokens = createMergeTokens();
- assertTokens(tokens, 3, 0);
+ /**
+ * Add Relationship NEW_TABLE->NEW_TABLE2 To Model
+ * Drop Relationship NEW_TABLE2->NEW_TABLE To DB
+ * Drop Column NEW_TABLE2.FK To DB
+ * */
+ assertTokens(tokens, 2, 1);
for (MergerToken token : tokens) {
if (token.getDirection().isToDb()) {
execute(token);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/merge/MergerFactoryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/merge/MergerFactoryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/merge/MergerFactoryIT.java
index 409f1c9..5c4c51b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/merge/MergerFactoryIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/merge/MergerFactoryIT.java
@@ -199,7 +199,7 @@ public class MergerFactoryIT extends MergeCase {
// relation from new_table to artist
DbRelationship r1 = new DbRelationship("toArtistR1");
r1.setSourceEntity(dbEntity);
- r1.setTargetEntity(artistDbEntity);
+ r1.setTargetEntityName(artistDbEntity);
r1.setToMany(false);
r1.addJoin(new DbJoin(r1, "ARTIST_ID", "ARTIST_ID"));
dbEntity.addRelationship(r1);
@@ -207,7 +207,7 @@ public class MergerFactoryIT extends MergeCase {
// relation from artist to new_table
DbRelationship r2 = new DbRelationship("toNewTableR2");
r2.setSourceEntity(artistDbEntity);
- r2.setTargetEntity(dbEntity);
+ r2.setTargetEntityName(dbEntity);
r2.setToMany(true);
r2.addJoin(new DbJoin(r2, "ARTIST_ID", "ARTIST_ID"));
artistDbEntity.addRelationship(r2);
@@ -219,8 +219,11 @@ public class MergerFactoryIT extends MergeCase {
dbEntity.removeRelationship(r1.getName());
artistDbEntity.removeRelationship(r2.getName());
resolver.refreshMappingCache();
- assertTokensAndExecute(2, 0);
-// assertTokensAndExecute(1, 1);
+ /*
+ * Db -Rel 'toArtistR1' - NEW_TABLE 1 -> 1 ARTIST"
+r2 = * Db -Rel 'toNewTableR2' - ARTIST 1 -> * NEW_TABLE"
+ * */
+ assertTokensAndExecute(1, 1);
assertTokensAndExecute(0, 0);
// clear up
@@ -257,7 +260,7 @@ public class MergerFactoryIT extends MergeCase {
// relation from new_table to artist
DbRelationship r1 = new DbRelationship("toArtistR1");
r1.setSourceEntity(dbEntity);
- r1.setTargetEntity(artistDbEntity);
+ r1.setTargetEntityName(artistDbEntity);
r1.setToMany(false);
r1.addJoin(new DbJoin(r1, "ARTIST_ID", "ARTIST_ID"));
dbEntity.addRelationship(r1);
@@ -265,7 +268,7 @@ public class MergerFactoryIT extends MergeCase {
// relation from artist to new_table
DbRelationship r2 = new DbRelationship("toNewTableR2");
r2.setSourceEntity(artistDbEntity);
- r2.setTargetEntity(dbEntity);
+ r2.setTargetEntityName(dbEntity);
r2.setToMany(true);
r2.addJoin(new DbJoin(r2, "ARTIST_ID", "ARTIST_ID"));
artistDbEntity.addRelationship(r2);
@@ -277,7 +280,11 @@ public class MergerFactoryIT extends MergeCase {
dbEntity.removeRelationship(r1.getName());
artistDbEntity.removeRelationship(r2.getName());
resolver.refreshMappingCache();
- assertTokensAndExecute(2, 0);
+ /*
+ * Add Relationship ARTIST->NEW_TABLE To Model
+ * Drop Relationship NEW_TABLE->ARTIST To DB
+ * */
+ assertTokensAndExecute(1, 1);
assertTokensAndExecute(0, 0);
// clear up
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-server/src/test/java/org/apache/cayenne/util/EntityMergeSupportIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/util/EntityMergeSupportIT.java b/cayenne-server/src/test/java/org/apache/cayenne/util/EntityMergeSupportIT.java
index 384ddd4..e3f1bc3 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/util/EntityMergeSupportIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/util/EntityMergeSupportIT.java
@@ -66,13 +66,13 @@ public class EntityMergeSupportIT extends MergeCase {
// create db relationships
DbRelationship rel1To2 = new DbRelationship("rel1To2");
rel1To2.setSourceEntity(dbEntity1);
- rel1To2.setTargetEntity(dbEntity2);
+ rel1To2.setTargetEntityName(dbEntity2);
rel1To2.setToMany(true);
rel1To2.addJoin(new DbJoin(rel1To2, e1col1.getName(), e2col2.getName()));
dbEntity1.addRelationship(rel1To2);
DbRelationship rel2To1 = new DbRelationship("rel2To1");
rel2To1.setSourceEntity(dbEntity2);
- rel2To1.setTargetEntity(dbEntity1);
+ rel2To1.setTargetEntityName(dbEntity1);
rel2To1.setToMany(false);
rel2To1.addJoin(new DbJoin(rel2To1, e2col2.getName(), e1col1.getName()));
dbEntity2.addRelationship(rel2To1);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
index bf981ee..cc05e15 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
@@ -1,21 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
package org.apache.cayenne.tools.dbimport;
import org.apache.cayenne.access.DbLoader;
@@ -26,9 +8,13 @@ import org.apache.cayenne.configuration.server.DbAdapterFactory;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.MapLoader;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.naming.ObjectNameGenerator;
import org.apache.cayenne.merge.DbMerger;
+import org.apache.cayenne.merge.DropTableToDb;
import org.apache.cayenne.merge.ExecutingMergerContext;
import org.apache.cayenne.merge.MergerContext;
import org.apache.cayenne.merge.MergerFactory;
@@ -37,6 +23,7 @@ import org.apache.cayenne.merge.ModelMergeDelegate;
import org.apache.cayenne.project.Project;
import org.apache.cayenne.project.ProjectSaver;
import org.apache.cayenne.resource.URLResource;
+import org.apache.cayenne.util.EntityMergeSupport;
import org.apache.cayenne.validation.SimpleValidationFailure;
import org.apache.cayenne.validation.ValidationFailure;
import org.apache.cayenne.validation.ValidationResult;
@@ -48,6 +35,7 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
@@ -117,7 +105,23 @@ public class DbImportAction {
if (!isBlank(config.getDefaultPackage())) {
existing.setDefaultPackage(config.getDefaultPackage());
}
- saveLoaded(execute(config.createMergeDelegate(), existing, log(reverse(mergerFactory, mergeTokens))));
+
+
+
+ DataMap executed = execute(config.createMergeDelegate(), existing, log(reverse(mergerFactory, mergeTokens)));
+
+ // TODO DbLoader shouldn't do by it self it should separate processor
+ ObjectNameGenerator nameGenerator = config.getNameGenerator();
+ Collection<ObjEntity> loadedObjEntities = new LinkedList<ObjEntity>();
+ for (MergerToken mergeToken : mergeTokens) {
+ if (mergeToken instanceof DropTableToDb) {
+ loadedObjEntities.addAll(executed.getMappedEntities(((DropTableToDb) mergeToken).getEntity()));
+ }
+ }
+
+ DbLoader.flattenManyToManyRelationships(executed, loadedObjEntities, nameGenerator);
+
+ saveLoaded(executed);
}
}
@@ -184,6 +188,10 @@ public class DbImportAction {
return dataMap;
}
+ private DbLoader getLoader(DbImportConfiguration config, DbAdapter adapter, Connection connection) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+ return config.createLoader(adapter, connection, config.createLoaderDelegate());
+ }
+
void saveLoaded(DataMap dataMap) throws FileNotFoundException {
ConfigurationTree<DataMap> projectRoot = new ConfigurationTree<DataMap>(dataMap);
Project project = new Project(projectRoot);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
index 7d71aaa..594e99a 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
@@ -33,6 +33,7 @@ import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.naming.LegacyNameGenerator;
import org.apache.cayenne.map.naming.ObjectNameGenerator;
import org.apache.cayenne.merge.DbMergerConfig;
import org.apache.cayenne.merge.DefaultModelMergeDelegate;
@@ -187,13 +188,18 @@ public class DbImportConfiguration {
};
// TODO: load via DI AdhocObjectFactory
+ loader.setNameGenerator(getNameGenerator());
+
+ return loader;
+ }
+
+ public ObjectNameGenerator getNameGenerator() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
String namingStrategy = getNamingStrategy();
if (namingStrategy != null) {
- ObjectNameGenerator nameGeneratorInst = (ObjectNameGenerator) Class.forName(namingStrategy).newInstance();
- loader.setNameGenerator(nameGeneratorInst);
+ return (ObjectNameGenerator) Class.forName(namingStrategy).newInstance();
}
- return loader;
+ return new LegacyNameGenerator(); // TODO
}
public void setDriver(String jdbcDriver) {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
index 19a51da..ce79cd5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
@@ -349,7 +349,7 @@ public class ResolveDbRelationshipDialog extends CayenneDialog {
if (reverseRelationship == null) {
reverseRelationship = new DbRelationship(targetEntityName);
reverseRelationship.setSourceEntity(relationship.getTargetEntity());
- reverseRelationship.setTargetEntity(relationship.getSourceEntity());
+ reverseRelationship.setTargetEntityName(relationship.getSourceEntity());
reverseRelationship.setToMany(!relationship.isToMany());
relationship.getTargetEntity().addRelationship(reverseRelationship);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
index c9093ff..0c6c237 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
@@ -191,7 +191,7 @@ public class InferRelationshipsController extends InferRelationshipsControllerBa
mediator.fireDbRelationshipEvent(e);
rel.setSourceEntity(temp.getSource());
- rel.setTargetEntity(temp.getTarget());
+ rel.setTargetEntityName(temp.getTarget());
DbJoin join = new DbJoin(rel, temp.getJoinSource().getName(), temp
.getJoinTarget()
.getName());
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
index 14cbe94..caf6ed5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
@@ -352,7 +352,7 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
// note: NamedObjectFactory doesn't set source or target, just the name
dbRelationship.setSourceEntity(targetModel.getSource());
- dbRelationship.setTargetEntity(targetModel.getTarget());
+ dbRelationship.setTargetEntityName(targetModel.getTarget());
dbRelationship.setToMany(targetModel.isToMany());
targetModel.getSource().addRelationship(dbRelationship);
@@ -606,7 +606,7 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
// note on events notification - this needs to be propagated
// via old modeler events, but we leave this to the controller
// since model knows nothing about Modeler mediator.
- relationship.setTargetEntity(objectTarget);
+ relationship.setTargetEntityName(objectTarget);
}
// check for path modifications
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
index 8c10a5d..5dca446 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
@@ -169,7 +169,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel {
}
else if (column == REL_TARGET) {
ObjEntity target = (ObjEntity) value;
- relationship.setTargetEntity(target);
+ relationship.setTargetEntityName(target);
/**
* Clear existing relationships, otherwise addDbRelationship() might fail
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
index e30a38b..50362c3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
@@ -136,7 +136,7 @@ public class DbRelationshipTableModel extends CayenneTableModel {
// clear joins...
rel.removeAllJoins();
- rel.setTargetEntity(target);
+ rel.setTargetEntityName(target);
RelationshipEvent e = new RelationshipEvent(eventSource, rel, entity);
mediator.fireDbRelationshipEvent(e);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
index a09f0a6..95f6d8e 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
@@ -568,7 +568,7 @@ public class EOModelProcessor {
dbRel = new DbRelationship();
dbRel.setSourceEntity(dbSrc);
- dbRel.setTargetEntity(dbTarget);
+ dbRel.setTargetEntityName(dbTarget);
dbRel.setToMany(toMany);
dbRel.setName(relName);
dbRel.setToDependentPK(toDependentPK);
@@ -599,7 +599,7 @@ public class EOModelProcessor {
ObjRelationship rel = new ObjRelationship();
rel.setName(relName);
rel.setSourceEntity(objEntity);
- rel.setTargetEntity(target);
+ rel.setTargetEntityName(target);
objEntity.addRelationship(rel);
if (dbRel != null) {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml
index a18b3f3..d3a85be 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml
@@ -26,8 +26,8 @@
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
</db-entity>
<db-entity name="A_B" schema="APP">
- <db-attribute name="A_ID" type="INTEGER" isMandatory="true" length="10"/>
- <db-attribute name="B_ID" type="INTEGER" isMandatory="true" length="10"/>
+ <db-attribute name="A_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+ <db-attribute name="B_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
</db-entity>
<db-entity name="B" schema="APP">
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
@@ -38,7 +38,7 @@
</obj-entity>
<obj-entity name="B" className="B" dbEntityName="B">
</obj-entity>
- <db-relationship name="aBArray" source="A" target="A_B" toMany="true">
+ <db-relationship name="aBArray" source="A" target="A_B" toDependentPK="true" toMany="true">
<db-attribute-pair source="ID" target="A_ID"/>
</db-relationship>
<db-relationship name="toA" source="A_B" target="A" toMany="false">
@@ -47,7 +47,7 @@
<db-relationship name="toB" source="A_B" target="B" toMany="false">
<db-attribute-pair source="B_ID" target="ID"/>
</db-relationship>
- <db-relationship name="aBArray" source="B" target="A_B" toMany="true">
+ <db-relationship name="aBArray" source="B" target="A_B" toDependentPK="true" toMany="true">
<db-attribute-pair source="ID" target="B_ID"/>
</db-relationship>
<obj-relationship name="toA" source="AB" target="A" deleteRule="Nullify" db-relationship-path="toA"/>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml-result
index f39e30f..f7d6f81 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml-result
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.map.xml-result
@@ -26,8 +26,8 @@
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
</db-entity>
<db-entity name="A_B" schema="APP">
- <db-attribute name="A_ID" type="INTEGER" isMandatory="true" length="10"/>
- <db-attribute name="B_ID" type="INTEGER" isMandatory="true" length="10"/>
+ <db-attribute name="A_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+ <db-attribute name="B_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
</db-entity>
<db-entity name="B" schema="APP">
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
@@ -35,6 +35,16 @@
<db-entity name="C" schema="APP">
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
</db-entity>
+ <db-entity name="X" schema="APP">
+ <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+ </db-entity>
+ <db-entity name="X_Y" schema="APP">
+ <db-attribute name="X_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+ <db-attribute name="Y_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+ </db-entity>
+ <db-entity name="Y" schema="APP">
+ <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+ </db-entity>
<obj-entity name="A" className="A" dbEntityName="A">
</obj-entity>
<obj-entity name="AB" className="AB" dbEntityName="A_B">
@@ -43,7 +53,11 @@
</obj-entity>
<obj-entity name="C" className="org.not.my.home.C" dbEntityName="C">
</obj-entity>
- <db-relationship name="aBArray" source="A" target="A_B" toMany="true">
+ <obj-entity name="X" className="org.not.my.home.X" dbEntityName="X">
+ </obj-entity>
+ <obj-entity name="Y" className="org.not.my.home.Y" dbEntityName="Y">
+ </obj-entity>
+ <db-relationship name="aBArray" source="A" target="A_B" toDependentPK="true" toMany="true">
<db-attribute-pair source="ID" target="A_ID"/>
</db-relationship>
<db-relationship name="toA" source="A_B" target="A" toMany="false">
@@ -52,9 +66,23 @@
<db-relationship name="toB" source="A_B" target="B" toMany="false">
<db-attribute-pair source="B_ID" target="ID"/>
</db-relationship>
- <db-relationship name="aBArray" source="B" target="A_B" toMany="true">
+ <db-relationship name="aBArray" source="B" target="A_B" toDependentPK="true" toMany="true">
<db-attribute-pair source="ID" target="B_ID"/>
</db-relationship>
+ <db-relationship name="xYArray" source="X" target="X_Y" toDependentPK="true" toMany="true">
+ <db-attribute-pair source="ID" target="X_ID"/>
+ </db-relationship>
+ <db-relationship name="toX" source="X_Y" target="X" toMany="false">
+ <db-attribute-pair source="X_ID" target="ID"/>
+ </db-relationship>
+ <db-relationship name="toY" source="X_Y" target="Y" toMany="false">
+ <db-attribute-pair source="Y_ID" target="ID"/>
+ </db-relationship>
+ <db-relationship name="xYArray" source="Y" target="X_Y" toDependentPK="true" toMany="true">
+ <db-attribute-pair source="ID" target="Y_ID"/>
+ </db-relationship>
<obj-relationship name="toA" source="AB" target="A" deleteRule="Nullify" db-relationship-path="toA"/>
<obj-relationship name="aBArray" source="B" target="AB" deleteRule="Deny" db-relationship-path="aBArray"/>
+ <obj-relationship name="yArray" source="X" target="Y" db-relationship-path="xYArray.toY"/>
+ <obj-relationship name="xArray" source="Y" target="X" db-relationship-path="xYArray.toX"/>
</data-map>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/54997aa6/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.sql
index 57dae83..b6f4eac 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.sql
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testUnFlattensManyToMany.sql
@@ -31,6 +31,7 @@ CREATE TABLE APP.A_B (
A_ID INTEGER NOT NULL,
B_ID INTEGER NOT NULL,
+ PRIMARY KEY (A_ID, B_ID),
CONSTRAINT A_B_A FOREIGN KEY (A_ID) REFERENCES APP.A (ID),
CONSTRAINT A_B_B FOREIGN KEY (B_ID) REFERENCES APP.B (ID)
);
@@ -39,4 +40,25 @@ CREATE TABLE APP.C (
id INTEGER NOT NULL,
PRIMARY KEY (id)
+);
+
+CREATE TABLE APP.X (
+ id INTEGER NOT NULL,
+
+ PRIMARY KEY (id)
+);
+
+CREATE TABLE APP.Y (
+ id INTEGER NOT NULL,
+
+ PRIMARY KEY (id)
+);
+
+CREATE TABLE APP.X_Y (
+ X_ID INTEGER NOT NULL,
+ Y_ID INTEGER NOT NULL,
+
+ PRIMARY KEY (X_ID, Y_ID),
+ CONSTRAINT X_Y_X FOREIGN KEY (X_ID) REFERENCES APP.X (ID),
+ CONSTRAINT X_Y_Y FOREIGN KEY (Y_ID) REFERENCES APP.Y (ID)
);
\ No newline at end of file
[3/3] cayenne git commit: hot fix for many-to-many relationships
revers engineering
Posted by aa...@apache.org.
hot fix for many-to-many relationships revers engineering
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/3b619d4e
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/3b619d4e
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/3b619d4e
Branch: refs/heads/master
Commit: 3b619d4e03e1c788d49f79c9711d81f3ec1a85ba
Parents: 01d29ec
Author: alexkolonitsky <Al...@gmail.com>
Authored: Mon Jan 19 17:11:27 2015 +0300
Committer: alexkolonitsky <Al...@gmail.com>
Committed: Mon Jan 19 17:11:27 2015 +0300
----------------------------------------------------------------------
.../src/main/java/org/apache/cayenne/map/DbRelationship.java | 8 +++++++-
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
2 files changed, 8 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3b619d4e/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
index cee22e8..d02fe14 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
@@ -540,7 +540,7 @@ public class DbRelationship extends Relationship implements ConfigurationNode {
StringBuilder res = new StringBuilder("Db Relationship : ");
res.append(toMany ? "toMany" : "toOne ");
- String sourceEntityName = getSourceEntity().getName();
+ String sourceEntityName = getSourceEntityName();
for (DbJoin join : joins) {
res.append(" (").append(sourceEntityName).append(".").append(join.getSourceName()).append(", ")
.append(targetEntityName).append(".").append(join.getTargetName()).append(")");
@@ -548,4 +548,10 @@ public class DbRelationship extends Relationship implements ConfigurationNode {
return res.toString();
}
+ public String getSourceEntityName() {
+ if (this.sourceEntity == null) {
+ return null;
+ }
+ return this.sourceEntity.name;
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3b619d4e/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 8100bc8..f1f3a56 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -14,6 +14,7 @@ Date:
----------------------------------
Changes/New Features:
+CAY-1984 cdbimport doesn't flatten many to many relationships
CAY-1826 Merge Entity Attributes and Relationships tabs together with one toolbar.
CAY-1839 Allow to link DataMaps to DataNodes from DataNode editor.
CAY-1841 Filters for Left-hand project navigator
[2/3] cayenne git commit: hot fix for many-to-many relationships
revers engineering
Posted by aa...@apache.org.
hot fix for many-to-many relationships revers engineering
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/01d29ecd
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/01d29ecd
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/01d29ecd
Branch: refs/heads/master
Commit: 01d29ecd7011a107957e57d67b51943eac857fc3
Parents: 54997aa c8ff435
Author: alexkolonitsky <Al...@gmail.com>
Authored: Mon Jan 19 17:10:51 2015 +0300
Committer: alexkolonitsky <Al...@gmail.com>
Committed: Mon Jan 19 17:10:51 2015 +0300
----------------------------------------------------------------------
.../access/loader/LoggingDbLoaderDelegate.java | 20 +--
.../org/apache/cayenne/map/Relationship.java | 6 +-
.../apache/cayenne/map/naming/ExportedKey.java | 18 ++-
.../org/apache/cayenne/query/SQLSelect.java | 2 +-
.../cayenne/query/SQLTemplateMetadata.java | 117 ++++++++--------
.../org/apache/cayenne/query/SQLSelectIT.java | 46 +++---
.../org/apache/cayenne/query/SQLSelectTest.java | 53 ++++++-
.../cayenne/tools/CayenneGeneratorTask.java | 11 +-
.../cayenne/tools/dbimport/DbImportAction.java | 30 ++--
.../dbimport/DbImportDbLoaderDelegate.java | 1 -
.../src/main/resources/reverseEngineering.xsd | 139 +++++++++++++++++++
.../cayenne/tools/DbImporterMojoTest.java | 4 +
.../cayenne/tools/dbimport/testOneToOne-pom.xml | 39 ++++++
.../tools/dbimport/testOneToOne.map.xml-result | 58 ++++++++
.../cayenne/tools/dbimport/testOneToOne.sql | 24 ++++
15 files changed, 451 insertions(+), 117 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/01d29ecd/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/01d29ecd/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportAction.java
----------------------------------------------------------------------