User: dsundstrom
Date: 01/12/01 13:55:05
Modified: src/main/org/jboss/ejb/plugins/cmp/jdbc
JDBCAbstractQueryCommand.java
JDBCCreateEntityCommand.java
JDBCDeleteRelationsCommand.java
JDBCFindByForeignKeyCommand.java
JDBCInsertRelationsCommand.java
JDBCLoadEntityCommand.java
JDBCLoadFieldCommand.java
JDBCLoadRelationCommand.java
JDBCReadAheadCommand.java
JDBCRelationInterceptor.java
JDBCRemoveEntityCommand.java JDBCStartCommand.java
JDBCStopCommand.java JDBCStoreEntityCommand.java
JDBCStoreManager.java
Log:
Added support for autogenerated foriegn key constraints on relationships.
Just add <fk-constraint>true</fk-constraint> to defaults or relationship
role.
Changed relation tables to synchronize data after jdbc store executes.
Revision Changes Path
1.2 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCAbstractQueryCommand.java
Index: JDBCAbstractQueryCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCAbstractQueryCommand.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- JDBCAbstractQueryCommand.java 2001/11/28 11:32:54 1.1
+++ JDBCAbstractQueryCommand.java 2001/12/01 21:55:04 1.2
@@ -42,7 +42,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public abstract class JDBCAbstractQueryCommand implements JDBCQueryCommand {
private JDBCStoreManager manager;
@@ -80,9 +80,10 @@
PreparedStatement ps = null;
try {
// get the connection
- con = manager.getDataSource().getConnection();
+ con = manager.getEntityBridge().getDataSource().getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql);
// set the parameters
1.9 +5 -3
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCCreateEntityCommand.java
Index: JDBCCreateEntityCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCCreateEntityCommand.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JDBCCreateEntityCommand.java 2001/11/29 20:40:05 1.8
+++ JDBCCreateEntityCommand.java 2001/12/01 21:55:04 1.9
@@ -32,7 +32,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
- * @version $Revision: 1.8 $
+ * @version $Revision: 1.9 $
*/
public class JDBCCreateEntityCommand implements CreateEntityCommand {
private JDBCStoreManager manager;
@@ -151,10 +151,11 @@
PreparedStatement ps = null;
try {
// get the connection
- DataSource dataSource = manager.getDataSource();
+ DataSource dataSource = entity.getDataSource();
con = dataSource.getConnection();
// create the statement
+ log.debug("Executing SQL: " + entityExistsSQL);
ps = con.prepareStatement(entityExistsSQL);
// set the parameters
@@ -188,10 +189,11 @@
int rowsAffected = 0;
try {
// get the connection
- DataSource dataSource = manager.getDataSource();
+ DataSource dataSource = entity.getDataSource();
con = dataSource.getConnection();
// create the statement
+ log.debug("Executing SQL: " + insertEntitySQL);
ps = con.prepareStatement(insertEntitySQL);
// set the parameters
1.6 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDeleteRelationsCommand.java
Index: JDBCDeleteRelationsCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDeleteRelationsCommand.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- JDBCDeleteRelationsCommand.java 2001/11/28 11:32:54 1.5
+++ JDBCDeleteRelationsCommand.java 2001/12/01 21:55:04 1.6
@@ -21,7 +21,7 @@
* Deletes relations from a relation table.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
*/
public class JDBCDeleteRelationsCommand {
private JDBCStoreManager manager;
@@ -60,6 +60,7 @@
con = dataSource.getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql);
// set the parameters
@@ -69,7 +70,7 @@
int rowsAffected = ps.executeUpdate();
log.debug("Create: Rows affected = " + rowsAffected);
} catch(Exception e) {
- throw new EJBException("Could delete relations from " +
+ throw new EJBException("Could not delete relations from " +
relationMetaData.getTableName(), e);
} finally {
JDBCUtil.safeClose(ps);
1.9 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCFindByForeignKeyCommand.java
Index: JDBCFindByForeignKeyCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCFindByForeignKeyCommand.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JDBCFindByForeignKeyCommand.java 2001/11/29 18:42:23 1.8
+++ JDBCFindByForeignKeyCommand.java 2001/12/01 21:55:04 1.9
@@ -23,7 +23,7 @@
* entity's table.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
- * @version $Revision: 1.8 $
+ * @version $Revision: 1.9 $
*/
public class JDBCFindByForeignKeyCommand {
private JDBCStoreManager manager;
@@ -59,9 +59,10 @@
PreparedStatement ps = null;
try {
// get the connection
- con = manager.getDataSource().getConnection();
+ con = entity.getDataSource().getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql.toString());
// set the parameters
1.8 +4 -4
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCInsertRelationsCommand.java
Index: JDBCInsertRelationsCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCInsertRelationsCommand.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- JDBCInsertRelationsCommand.java 2001/11/28 11:32:54 1.7
+++ JDBCInsertRelationsCommand.java 2001/12/01 21:55:04 1.8
@@ -22,7 +22,7 @@
* Inserts relations into a relation table.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
- * @version $Revision: 1.7 $
+ * @version $Revision: 1.8 $
*/
public class JDBCInsertRelationsCommand {
protected JDBCStoreManager manager;
@@ -56,11 +56,11 @@
con = dataSource.getConnection();
// get the sql
- String theSQL = getSQL(relationData);
- log.debug("InsertRelations command executing: " + theSQL);
+ String sql = getSQL(relationData);
// get a prepared statement
- ps = con.prepareStatement(theSQL);
+ log.debug("Executing SQL: " + sql);
+ ps = con.prepareStatement(sql);
Iterator pairs = relationData.addedRelations.iterator();
while(pairs.hasNext()) {
1.10 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadEntityCommand.java
Index: JDBCLoadEntityCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadEntityCommand.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- JDBCLoadEntityCommand.java 2001/11/29 18:42:23 1.9
+++ JDBCLoadEntityCommand.java 2001/12/01 21:55:04 1.10
@@ -33,7 +33,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Dirk Zimmermann</a>
* @author <a href="mailto:[EMAIL PROTECTED]">danch (Dan Christopherson)</a>
- * @version $Revision: 1.9 $
+ * @version $Revision: 1.10 $
*/
public class JDBCLoadEntityCommand implements LoadEntityCommand {
private JDBCStoreManager manager;
@@ -78,9 +78,10 @@
PreparedStatement ps = null;
try {
// get the connection
- con = manager.getDataSource().getConnection();
+ con = entity.getDataSource().getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql.toString());
// set the parameters
1.9 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadFieldCommand.java
Index: JDBCLoadFieldCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadFieldCommand.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JDBCLoadFieldCommand.java 2001/11/29 18:42:23 1.8
+++ JDBCLoadFieldCommand.java 2001/12/01 21:55:04 1.9
@@ -30,7 +30,7 @@
* fields.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
- * @version $Revision: 1.8 $
+ * @version $Revision: 1.9 $
*/
public class JDBCLoadFieldCommand {
private JDBCStoreManager manager;
@@ -88,9 +88,10 @@
PreparedStatement ps = null;
try {
// get the connection
- con = manager.getDataSource().getConnection();
+ con = entity.getDataSource().getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql.toString());
// set the parameters
1.8 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadRelationCommand.java
Index: JDBCLoadRelationCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCLoadRelationCommand.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- JDBCLoadRelationCommand.java 2001/11/29 18:42:23 1.7
+++ JDBCLoadRelationCommand.java 2001/12/01 21:55:05 1.8
@@ -22,7 +22,7 @@
* Loads relations for a particular entity from a relation table.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
- * @version $Revision: 1.7 $
+ * @version $Revision: 1.8 $
*/
public class JDBCLoadRelationCommand {
private JDBCStoreManager manager;
@@ -61,9 +61,10 @@
PreparedStatement ps = null;
try {
// get the connection
- con = manager.getDataSource().getConnection();
+ con = cmrField.getRelationMetaData().getDataSource().getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql.toString());
// set the parameters
1.6 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCReadAheadCommand.java
Index: JDBCReadAheadCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCReadAheadCommand.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- JDBCReadAheadCommand.java 2001/11/29 18:42:23 1.5
+++ JDBCReadAheadCommand.java 2001/12/01 21:55:05 1.6
@@ -24,7 +24,7 @@
* JDBCReadAheadCommand
*
* @author <a href="mailto:[EMAIL PROTECTED]">Oleg Nitz</a>
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
*/
public class JDBCReadAheadCommand {
@@ -71,9 +71,10 @@
PreparedStatement ps = null;
try {
// get the connection
- con = manager.getDataSource().getConnection();
+ con = entity.getDataSource().getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql);
// set the parameters
1.8 +34 -44
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRelationInterceptor.java
Index: JDBCRelationInterceptor.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRelationInterceptor.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- JDBCRelationInterceptor.java 2001/11/26 03:12:26 1.7
+++ JDBCRelationInterceptor.java 2001/12/01 21:55:05 1.8
@@ -32,7 +32,7 @@
* relationship. This interceptor also manages the relation table data.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
- * @version $Revision: 1.7 $
+ * @version $Revision: 1.8 $
*/
public class JDBCRelationInterceptor extends AbstractInterceptor
{
@@ -100,7 +100,8 @@
public Object invoke(MethodInvocation mi) throws Exception
{
// We are going to work with the context a lot
- EntityEnterpriseContext ctx =
(EntityEnterpriseContext)mi.getEnterpriseContext();
+ EntityEnterpriseContext ctx =
+ (EntityEnterpriseContext)mi.getEnterpriseContext();
// The Tx coming as part of the Method Invocation
Transaction tx = mi.getTransaction();
@@ -111,33 +112,46 @@
{
// call getRelateId
- JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge)mi.getArguments()[0];
+ JDBCCMRFieldBridge cmrField =
+ (JDBCCMRFieldBridge)mi.getArguments()[0];
return cmrField.getRelatedId(ctx);
} else if(ADD_RELATION.equals(mi.getMethod()))
{
// call addRelation
- JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge)mi.getArguments()[0];
+ JDBCCMRFieldBridge cmrField =
+ (JDBCCMRFieldBridge)mi.getArguments()[0];
Object relatedId = mi.getArguments()[1];
cmrField.addRelation(ctx, relatedId);
RelationData relationData = getRelationData(cmrField, tx);
- relationData.addRelation(cmrField, ctx.getId(),
cmrField.getRelatedCMRField(), relatedId);
+ relationData.addRelation(
+ cmrField,
+ ctx.getId(),
+ cmrField.getRelatedCMRField(),
+ relatedId);
+
return null;
} else if(REMOVE_RELATION.equals(mi.getMethod()))
{
// call removeRelation
- JDBCCMRFieldBridge cmrField = (JDBCCMRFieldBridge)mi.getArguments()[0];
+ JDBCCMRFieldBridge cmrField =
+ (JDBCCMRFieldBridge)mi.getArguments()[0];
Object relatedId = mi.getArguments()[1];
cmrField.removeRelation(ctx, relatedId);
RelationData relationData = getRelationData(cmrField, tx);
- relationData.removeRelation(cmrField, ctx.getId(),
cmrField.getRelatedCMRField(), relatedId);
+ relationData.removeRelation(
+ cmrField,
+ ctx.getId(),
+ cmrField.getRelatedCMRField(),
+ relatedId);
+
return null;
} else
@@ -152,7 +166,8 @@
}
}
- protected RelationData getRelationData(JDBCCMRFieldBridge cmrField, Transaction
tx)
+ protected RelationData getRelationData(
+ JDBCCMRFieldBridge cmrField, Transaction tx)
{
Map txDataMap = cmrField.getJDBCStoreManager().getTxDataMap();
Map txData = (Map)txDataMap.get(tx);
@@ -162,11 +177,13 @@
txDataMap.put(tx, txData);
}
- JDBCRelationMetaData relationMetaData =
cmrField.getMetaData().getRelationMetaData();
+ JDBCRelationMetaData relationMetaData =
+ cmrField.getMetaData().getRelationMetaData();
RelationData relationData = (RelationData)txData.get(relationMetaData);
if(relationData == null)
{
- relationData = new RelationData(cmrField, cmrField.getRelatedCMRField());
+ relationData = new RelationData(
+ cmrField, cmrField.getRelatedCMRField());
txData.put(relationMetaData, relationData);
}
return relationData;
@@ -222,45 +239,18 @@
// This is an independent point of entry. We need to make sure the
// thread is associated with the right context class loader
ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(container.getClassLoader());
+ Thread.currentThread().setContextClassLoader(
+ container.getClassLoader());
try
{
// Get the manager
- CMPPersistenceManager cmpPM =
(CMPPersistenceManager)container.getPersistenceManager();
- JDBCStoreManager manager =
(JDBCStoreManager)cmpPM.getPersistenceStore();
+ CMPPersistenceManager cmpPM =
+ (CMPPersistenceManager)container.getPersistenceManager();
+ JDBCStoreManager manager =
+ (JDBCStoreManager)cmpPM.getPersistenceStore();
- // Save each relation
- Map txDataMap = manager.getTxDataMap();
- Map txData = (Map)txDataMap.get(tx);
- if(txData != null)
- {
- Iterator iterator = txData.values().iterator();
- while(iterator.hasNext())
- {
- Object obj = iterator.next();
- if(obj instanceof RelationData)
- {
- RelationData relationData = (RelationData) obj;
-
- // only need to bother if neither side has a foreign key
- if(!relationData.getLeftCMRField().hasForeignKey() &&
- !relationData.getRightCMRField().hasForeignKey())
- {
-
- // delete all removed pairs from relation table
- manager.deleteRelations(relationData);
-
- // insert all added pairs into the relation table
- manager.insertRelations(relationData);
-
- relationData.addedRelations.clear();
- relationData.removedRelations.clear();
- relationData.notRelatedPairs.clear();
- }
- }
- }
- }
+ manager.synchronizeRelationData(tx);
} catch (Exception e)
{
log.error("ex", e);
1.10 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRemoveEntityCommand.java
Index: JDBCRemoveEntityCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCRemoveEntityCommand.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- JDBCRemoveEntityCommand.java 2001/11/29 20:40:05 1.9
+++ JDBCRemoveEntityCommand.java 2001/12/01 21:55:05 1.10
@@ -30,7 +30,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
- * @version $Revision: 1.9 $
+ * @version $Revision: 1.10 $
*/
public class JDBCRemoveEntityCommand implements RemoveEntityCommand {
@@ -76,10 +76,11 @@
int rowsAffected = 0;
try {
// get the connection
- DataSource dataSource = manager.getDataSource();
+ DataSource dataSource = entity.getDataSource();
con = dataSource.getConnection();
// create the statement
+ log.debug("Executing SQL: " + removeEntitySQL);
ps = con.prepareStatement(removeEntitySQL);
// set the parameters
1.10 +132 -24
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStartCommand.java
Index: JDBCStartCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStartCommand.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- JDBCStartCommand.java 2001/11/29 19:09:15 1.9
+++ JDBCStartCommand.java 2001/12/01 21:55:05 1.10
@@ -12,6 +12,7 @@
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
+import java.util.HashSet;
import javax.sql.DataSource;
import javax.ejb.EJBException;
@@ -32,7 +33,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Michel de Groot</a>
- * @version $Revision: 1.9 $
+ * @version $Revision: 1.10 $
*/
public class JDBCStartCommand implements StartCommand {
@@ -40,8 +41,9 @@
private JDBCEntityBridge entity;
private JDBCEntityMetaData entityMetaData;
private Logger log;
- private boolean alreadyCreated = false;
+ private HashSet createdTables = new HashSet();
+
public JDBCStartCommand(JDBCStoreManager manager) {
this.manager = manager;
entity = manager.getEntityBridge();
@@ -55,36 +57,51 @@
}
public void execute() throws Exception {
- // Create table if necessary
- if(!alreadyCreated || entityMetaData.getCreateTable()) {
- createTable(
- manager.getDataSource(),
- entityMetaData.getTableName(),
- getEntityCreateTableSQL());
- alreadyCreated = true;
- }
-
+ // Create table if necessary
+ if(!entity.getTableExists()) {
+ if(entityMetaData.getCreateTable()) {
+ createTable(
+ entity.getDataSource(),
+ entity.getTableName(),
+ getEntityCreateTableSQL());
+ } else {
+ log.debug("Table not create as requested: " +
+ entity.getTableName());
+ }
+ entity.setTableExists(true);
+ }
+
// create relation tables
JDBCCMRFieldBridge[] cmrFields = entity.getJDBCCMRFields();
for(int i=0; i<cmrFields.length; i++) {
JDBCRelationMetaData relationMetaData =
cmrFields[i].getRelationMetaData();
- if(relationMetaData.isTableMappingStyle() &&
- !relationMetaData.getTableExists()) {
-
- if(relationMetaData.getCreateTable()) {
- createTable(
- relationMetaData.getDataSource(),
- relationMetaData.getTableName(),
- getRelationCreateTableSQL(cmrFields[i]));
- } else {
- log.info("Table not create as requested: " +
- relationMetaData.getTableName());
+ // if the table for the related entity has been created
+ if(cmrFields[i].getRelatedEntity().getTableExists()) {
+
+ // create the relation table
+ if(relationMetaData.isTableMappingStyle() &&
+ !relationMetaData.getTableExists()) {
+
+ if(relationMetaData.getCreateTable()) {
+ createTable(
+ relationMetaData.getDataSource(),
+ relationMetaData.getTableName(),
+ getRelationCreateTableSQL(cmrFields[i]));
+ } else {
+ log.debug("Relation table not create as requested: " +
+ relationMetaData.getTableName());
+ }
}
-
relationMetaData.setTableExists(true);
+
+ // Create my fk constraint
+ addForeignKeyConstraint(cmrFields[i]);
+
+ // Create related fk constraint
+ addForeignKeyConstraint(cmrFields[i].getRelatedCMRField());
}
}
}
@@ -121,6 +138,7 @@
// success
log.info("Created table '" + tableName + "' successfully.");
+ createdTables.add(tableName);
} catch (Exception e) {
log.debug("Could not create table " + tableName, e);
try {
@@ -186,7 +204,8 @@
sql.append(SQLUtil.getColumnNamesClause(
entity.getJDBCPrimaryKeyFields()));
sql.append(")");
- }
+ }
+
sql.append(")");
return sql.toString();
@@ -224,5 +243,94 @@
sql.append(")");
return sql.toString();
+ }
+
+ private void addForeignKeyConstraint(JDBCCMRFieldBridge cmrField) {
+ if(cmrField.getMetaData().hasForeignKeyConstraint()) {
+
+ if(cmrField.getRelationMetaData().isTableMappingStyle()) {
+ addForeignKeyConstraint(
+ cmrField.getRelationMetaData().getDataSource(),
+ cmrField.getRelationMetaData().getTableName(),
+ cmrField.getTableKeyFields(),
+ cmrField.getEntity().getTableName(),
+ cmrField.getEntity().getJDBCPrimaryKeyFields());
+
+ } else if(cmrField.hasForeignKey()) {
+ addForeignKeyConstraint(
+ cmrField.getEntity().getDataSource(),
+ cmrField.getEntity().getTableName(),
+ cmrField.getForeignKeyFields(),
+ cmrField.getRelatedEntity().getTableName(),
+ cmrField.getRelatedEntity().getJDBCPrimaryKeyFields());
+ }
+ } else {
+ log.debug("Foreign key constaint not added as requested: " +
+ "relationshipRolename=" +
+ cmrField.getMetaData().getRelationshipRoleName());
+ }
+
+ }
+
+ private void addForeignKeyConstraint(
+ DataSource dataSource,
+ String tableName,
+ JDBCCMPFieldBridge[] fields,
+ String referencesTableName,
+ JDBCCMPFieldBridge[] referencesFields) {
+
+ // can only alter tables we created
+ if(!createdTables.contains(tableName)) {
+ return;
+ }
+
+ StringBuffer sql = new StringBuffer(100);
+
+ sql.append("ALTER TABLE ").append(tableName);
+ sql.append(" ADD CONSTRAINT fk").append(tableName);
+
+
+ sql.append(" FOREIGN KEY (");
+ sql.append(SQLUtil.getColumnNamesClause(fields));
+ sql.append(")");
+
+ sql.append(" REFERENCES ").append(referencesTableName);
+ sql.append("(");
+ sql.append(SQLUtil.getColumnNamesClause(referencesFields));
+ sql.append(")");
+
+ Connection con = null;
+ Statement statement = null;
+ try {
+ // since we use the pools, we have to do this within a transaction
+ manager.getContainer().getTransactionManager().begin();
+
+ // get the connection
+ con = dataSource.getConnection();
+
+ // create the statement
+ statement = con.createStatement();
+
+ // execute sql
+ log.debug("Executing SQL: " + sql);
+ statement.executeUpdate(sql.toString());
+
+ // commit the transaction
+ manager.getContainer().getTransactionManager().commit();
+
+ // success
+ log.info("Added foreign key constriant to table '" + tableName);
+ } catch (Exception e) {
+ log.debug("Could not add foreign key constriant to table " +
+ tableName, e);
+ try {
+ manager.getContainer().getTransactionManager().rollback ();
+ } catch (Exception _e) {
+ log.error("Could not roll back transaction: ", e);
+ }
+ } finally {
+ JDBCUtil.safeClose(statement);
+ JDBCUtil.safeClose(con);
+ }
}
}
1.6 +2 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStopCommand.java
Index: JDBCStopCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStopCommand.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- JDBCStopCommand.java 2001/11/28 11:32:54 1.5
+++ JDBCStopCommand.java 2001/12/01 21:55:05 1.6
@@ -28,7 +28,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
*/
public class JDBCStopCommand implements StopCommand {
@@ -52,7 +52,7 @@
public void execute() {
if(entityMetaData.getRemoveTable()) {
log.debug("Droping table for entity " + entity.getEntityName());
- dropTable(manager.getDataSource(), entityMetaData.getTableName());
+ dropTable(entity.getDataSource(), entityMetaData.getTableName());
}
// drop relation tables
1.8 +3 -2
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreEntityCommand.java
Index: JDBCStoreEntityCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreEntityCommand.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- JDBCStoreEntityCommand.java 2001/11/28 11:32:54 1.7
+++ JDBCStoreEntityCommand.java 2001/12/01 21:55:05 1.8
@@ -28,7 +28,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Sebastien Alborini</a>
- * @version $Revision: 1.7 $
+ * @version $Revision: 1.8 $
*/
public class JDBCStoreEntityCommand implements StoreEntityCommand {
private JDBCStoreManager manager;
@@ -68,9 +68,10 @@
int rowsAffected = 0;
try {
// get the connection
- con = manager.getDataSource().getConnection();
+ con = entity.getDataSource().getConnection();
// create the statement
+ log.debug("Executing SQL: " + sql);
ps = con.prepareStatement(sql.toString());
// set the parameters
1.16 +31 -21
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreManager.java
Index: JDBCStoreManager.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCStoreManager.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- JDBCStoreManager.java 2001/11/29 18:42:23 1.15
+++ JDBCStoreManager.java 2001/12/01 21:55:05 1.16
@@ -21,9 +21,6 @@
import javax.ejb.EJBException;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
-import javax.sql.DataSource;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
@@ -64,7 +61,7 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Dain Sundstrom</a>
* @see org.jboss.ejb.EntityPersistenceStore
- * @version $Revision: 1.15 $
+ * @version $Revision: 1.16 $
*/
public class JDBCStoreManager implements EntityPersistenceStore2 {
@@ -82,7 +79,6 @@
private JDBCEntityMetaData metaData;
private JDBCEntityBridge entityBridge;
- private DataSource dataSource;
private JDBCTypeFactory typeFactory;
private JDBCQueryManager queryManager;
@@ -151,13 +147,6 @@
return entityBridge;
}
- /**
- * Returns the datasource for this entity.
- */
- public DataSource getDataSource() {
- return dataSource;
- }
-
public JDBCTypeFactory getJDBCTypeFactory() {
return typeFactory;
}
@@ -186,15 +175,6 @@
metaData = loadJDBCEntityMetaData();
- // find the datasource
- try {
- dataSource = (DataSource)new InitialContext().lookup(
- metaData.getDataSourceName());
- } catch(NamingException e) {
- throw new DeploymentException("Error: can't find data source: " +
- metaData.getDataSourceName());
- }
-
// setup the type factory, which is used to map java types to sql types.
typeFactory = new JDBCTypeFactory(
metaData.getTypeMapping(),
@@ -391,7 +371,37 @@
public void storeEntity(EntityEnterpriseContext ctx) {
storeEntityCommand.execute(ctx);
+ synchronizeRelationData(ctx.getTransaction());
}
+
+ public void synchronizeRelationData(Transaction tx) {
+ Map txDataMap = getTxDataMap();
+ Map txData = (Map)txDataMap.get(tx);
+ if(txData != null) {
+ Iterator iterator = txData.values().iterator();
+ while(iterator.hasNext()) {
+ Object obj = iterator.next();
+ if(obj instanceof RelationData) {
+ RelationData relationData = (RelationData) obj;
+
+ // only need to bother if neither side has a foreign key
+ if(!relationData.getLeftCMRField().hasForeignKey() &&
+ !relationData.getRightCMRField().hasForeignKey()) {
+
+ // delete all removed pairs from relation table
+ deleteRelations(relationData);
+
+ // insert all added pairs into the relation table
+ insertRelations(relationData);
+
+ relationData.addedRelations.clear();
+ relationData.removedRelations.clear();
+ relationData.notRelatedPairs.clear();
+ }
+ }
+ }
+ }
+ }
public void passivateEntity(EntityEnterpriseContext ctx) {
passivateEntityCommand.execute(ctx);
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development