From: Andreas Müller Date: Wed, 5 Jan 2011 19:15:07 +0000 (+0000) Subject: Changed DefinedTermBase.media form OneToMany to ManyToMany #560 X-Git-Tag: 3.0.3~255 X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/commitdiff_plain/0a6f2f532873b72488627e73f2155ca234beafdc Changed DefinedTermBase.media form OneToMany to ManyToMany #560 --- diff --git a/.gitattributes b/.gitattributes index 3d03d193a1..63ffc6fdd5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -961,6 +961,7 @@ cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/TableCreator.j cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/TableDroper.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/TableNameChanger.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/TermUpdaterBase.java -text +cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/UniqueIndexDropper.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/UpdaterBase.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/VocabularyCreator.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v24_25/SchemaUpdater_24_25.java -text @@ -972,6 +973,7 @@ cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v25_30/SchemaU cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v25_30/SequenceTableCreator.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v25_30/TermUpdater_25_30.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v30_31/LanguageLabelUpdater.java -text +cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v30_31/SchemaUpdater_30_31.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v30_31/TermUpdater_30_31.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/AbstractBeanInitializer.java -text cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/AutoPropertyInitializer.java -text diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/CdmMetaData.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/CdmMetaData.java index 99e81133b2..c1519c2a46 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/CdmMetaData.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/CdmMetaData.java @@ -47,8 +47,8 @@ public class CdmMetaData extends CdmBase{ * be handled by SCHEMA_VALIDATION.UPDATE * The last number represents the date of change. */ - private static final String dbSchemaVersion = "3.0.0.0.201011090000"; - +// private static final String dbSchemaVersion = "3.0.0.1.201101050000"; + private static final String dbSchemaVersion = "3.0.0.0.201011090000"; /** * @return a list of default metadata objects diff --git a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/DefinedTermBase.java b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/DefinedTermBase.java index a18f8d400f..f17b90d3fd 100644 --- a/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/DefinedTermBase.java +++ b/cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/common/DefinedTermBase.java @@ -19,9 +19,11 @@ import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Transient; +import javax.validation.constraints.NotNull; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -141,7 +143,8 @@ public abstract class DefinedTermBase extends TermBas @XmlElement(name = "Medium") @XmlIDREF @XmlSchemaType(name = "IDREF") - @OneToMany(fetch = FetchType.LAZY) + @ManyToMany(fetch = FetchType.LAZY) + @OneToMany(fetch = FetchType.LAZY) @Cascade({CascadeType.SAVE_UPDATE}) private Set media = new HashSet(); diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/CdmUpdater.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/CdmUpdater.java index 4b63121efb..350f32f770 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/CdmUpdater.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/CdmUpdater.java @@ -15,7 +15,7 @@ import eu.etaxonomy.cdm.common.DefaultProgressMonitor; import eu.etaxonomy.cdm.common.IProgressMonitor; import eu.etaxonomy.cdm.database.CdmDataSource; import eu.etaxonomy.cdm.database.ICdmDataSource; -import eu.etaxonomy.cdm.database.update.v25_30.SchemaUpdater_25_30; +import eu.etaxonomy.cdm.database.update.v30_31.SchemaUpdater_30_31; import eu.etaxonomy.cdm.database.update.v30_31.TermUpdater_30_31; /** @@ -78,7 +78,7 @@ public class CdmUpdater { * @return */ private ISchemaUpdater getCurrentSchemaUpdater() { - return SchemaUpdater_25_30.NewInstance(); + return SchemaUpdater_30_31.NewInstance(); } /** diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/UniqueIndexDropper.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/UniqueIndexDropper.java new file mode 100644 index 0000000000..68f41114d6 --- /dev/null +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/UniqueIndexDropper.java @@ -0,0 +1,157 @@ +// $Id$ +/** +* Copyright (C) 2009 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ +package eu.etaxonomy.cdm.database.update; + +import java.sql.SQLException; + +import org.apache.log4j.Logger; + +import eu.etaxonomy.cdm.common.IProgressMonitor; +import eu.etaxonomy.cdm.database.DatabaseTypeEnum; +import eu.etaxonomy.cdm.database.ICdmDataSource; + +/** + * @author a.mueller + * @date 16.09.2010 + * + */ +public class UniqueIndexDropper extends SchemaUpdaterStepBase implements ISchemaUpdaterStep { + private static final Logger logger = Logger.getLogger(UniqueIndexDropper.class); + + private String tableName; + private String indexColumn; + private boolean includeAudTable; + + public static final UniqueIndexDropper NewInstance(String tableName, String indexColumn, boolean includeAudTable){ + String stepName = "Drop index " + tableName + "-" + indexColumn; + return new UniqueIndexDropper(stepName, tableName, indexColumn, includeAudTable); + } + + + protected UniqueIndexDropper(String stepName, String tableName, String indexColumn, boolean includeAudTable) { + super(stepName); + this.tableName = tableName; + this.indexColumn = indexColumn; + this.includeAudTable = includeAudTable; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase#invoke(eu.etaxonomy.cdm.database.ICdmDataSource, eu.etaxonomy.cdm.common.IProgressMonitor) + */ + @Override + public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor) throws SQLException { + boolean result = true; + result &= dropIndex(tableName, datasource, monitor); + if (includeAudTable){ + String aud = "_AUD"; + result &= dropIndex(tableName + aud, datasource, monitor); + } + return (result == true )? 0 : null; + } + + private boolean dropIndex(String tableName, ICdmDataSource datasource, IProgressMonitor monitor) { + try { + if (checkExists(datasource)){ + String updateQuery = getUpdateQueryString(tableName, datasource, monitor); + datasource.executeUpdate(updateQuery); + } + return true; + } catch ( DatabaseTypeNotSupportedException e) { + e.printStackTrace(); + return false; + } catch ( SQLException e) { + e.printStackTrace(); + return false; + } + } + + private boolean checkExists(ICdmDataSource datasource) throws SQLException, DatabaseTypeNotSupportedException { + DatabaseTypeEnum type = datasource.getDatabaseType(); + if (type.equals(DatabaseTypeEnum.MySQL)){ + String sql = "SELECT count(*) FROM information_schema.TABLE_CONSTRAINTS " + + " WHERE table_name ='@tableName' AND CONSTRAINT_SCHEMA = '@dbName' AND CONSTRAINT_TYPE = 'UNIQUE' "; + sql = sql.replace("@tableName", tableName); + sql = sql.replace("@columnName", indexColumn); + sql = sql.replace("@dbName", datasource.getDatabase()); + long count = (Long)datasource.getSingleValue(sql); + return count > 0; + }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){ + logger.warn("checkExists not yet implemented for PostGreSQL" ); + return true; + }else if (type.equals(DatabaseTypeEnum.H2)){ + String indexName = getIndexName(datasource); + return indexName != null; + }else{ + // not needed + return true; + } + } + + + public String getUpdateQueryString(String tableName, ICdmDataSource datasource, IProgressMonitor monitor) throws DatabaseTypeNotSupportedException, SQLException { + String updateQuery; + DatabaseTypeEnum type = datasource.getDatabaseType(); + String indexName = getIndexName(datasource); + +// if (type.equals(DatabaseTypeEnum.SqlServer2005)){ + //MySQL allows both syntaxes +// updateQuery = "ALTER TABLE @tableName ADD @columnName @columnType"; +// }else + if (type.equals(DatabaseTypeEnum.H2)){ + updateQuery = "ALTER TABLE @tableName DROP CONSTRAINT IF EXISTS @indexName"; + }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){ +// updateQuery = "DROP INDEX IF EXISTS @indexName"; // does not work because index is used in the constraint +// updateQuery = "ALTER TABLE @tableName DROP CONSTRAINT IF EXISTS @indexName"; //"if exists" does not work (version 8.4) + updateQuery = "ALTER TABLE @tableName DROP CONSTRAINT @indexName"; + }else if (type.equals(DatabaseTypeEnum.MySQL)){ + updateQuery = "ALTER TABLE @tableName DROP INDEX @indexName"; + }else{ + updateQuery = null; + String warning = "Update step '" + this.getStepName() + "' is not supported by " + type.getName(); + monitor.warning(warning); + throw new DatabaseTypeNotSupportedException(warning); + } + updateQuery = updateQuery.replace("@tableName", tableName); + updateQuery = updateQuery.replace("@indexName", indexName); + + return updateQuery; + } + + + private String getIndexName(ICdmDataSource datasource) throws DatabaseTypeNotSupportedException, SQLException { + String result = this.indexColumn; + DatabaseTypeEnum type = datasource.getDatabaseType(); + if (type.equals(DatabaseTypeEnum.SqlServer2005)){ + throw new DatabaseTypeNotSupportedException(type.toString()); + }else if (type.equals(DatabaseTypeEnum.MySQL)){ + result = this.indexColumn; + }else if (type.equals(DatabaseTypeEnum.H2) ){ +// String sql = "SELECT INDEX_NAME FROM INFORMATION_SCHEMA.INDEXES WHERE TABLE_NAME = @tableName AND INDEX_TYPE_NAME = 'UNIQUE INDEX'"; + String sql = "SELECT CONSTRAINT_NAME " + + " FROM INFORMATION_SCHEMA.CONSTRAINTS "+ + " WHERE CONSTRAINT_CATALOG = '@dbName' AND "+ + " TABLE_NAME = '@tableName' AND CONSTRAINT_TYPE = 'UNIQUE' AND "+ + " COLUMN_LIST = '@columnName'"; + sql = sql.replace("@tableName", tableName.toUpperCase()); + sql = sql.replace("@columnName", indexColumn.toUpperCase()); + sql = sql.replace("@dbName", datasource.getDatabase().toUpperCase()); + String constraintName = (String)datasource.getSingleValue(sql); + result = constraintName; + }else if (type.equals(DatabaseTypeEnum.PostgreSQL)){ + result = this.tableName + "_" + this.indexColumn + "_key"; + }else{ + throw new DatabaseTypeNotSupportedException(type.toString()); + } + return result; + + } + + +} diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v25_30/SchemaUpdater_25_30.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v25_30/SchemaUpdater_25_30.java index 8e23d381b7..427de508bf 100644 --- a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v25_30/SchemaUpdater_25_30.java +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v25_30/SchemaUpdater_25_30.java @@ -27,6 +27,7 @@ import eu.etaxonomy.cdm.database.update.TableCreator; import eu.etaxonomy.cdm.database.update.TableDroper; import eu.etaxonomy.cdm.database.update.TableNameChanger; import eu.etaxonomy.cdm.database.update.v24_25.SchemaUpdater_24_25; +import eu.etaxonomy.cdm.database.update.v30_31.SchemaUpdater_30_31; /** @@ -314,7 +315,7 @@ public class SchemaUpdater_25_30 extends SchemaUpdaterBase { */ @Override public ISchemaUpdater getNextUpdater() { - return null; + return SchemaUpdater_30_31.NewInstance(); } /* (non-Javadoc) diff --git a/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v30_31/SchemaUpdater_30_31.java b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v30_31/SchemaUpdater_30_31.java new file mode 100644 index 0000000000..65b7a2c312 --- /dev/null +++ b/cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v30_31/SchemaUpdater_30_31.java @@ -0,0 +1,93 @@ +// $Id$ +/** +* Copyright (C) 2007 EDIT +* European Distributed Institute of Taxonomy +* http://www.e-taxonomy.eu +* +* The contents of this file are subject to the Mozilla Public License Version 1.1 +* See LICENSE.TXT at the top of this package for the full license terms. +*/ + +package eu.etaxonomy.cdm.database.update.v30_31; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import eu.etaxonomy.cdm.database.update.ColumnAdder; +import eu.etaxonomy.cdm.database.update.ColumnNameChanger; +import eu.etaxonomy.cdm.database.update.ColumnRemover; +import eu.etaxonomy.cdm.database.update.ISchemaUpdater; +import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep; +import eu.etaxonomy.cdm.database.update.MapTableCreator; +import eu.etaxonomy.cdm.database.update.MnTableCreator; +import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase; +import eu.etaxonomy.cdm.database.update.TableCreator; +import eu.etaxonomy.cdm.database.update.TableDroper; +import eu.etaxonomy.cdm.database.update.TableNameChanger; +import eu.etaxonomy.cdm.database.update.UniqueIndexDropper; +import eu.etaxonomy.cdm.database.update.v24_25.SchemaUpdater_24_25; +import eu.etaxonomy.cdm.database.update.v25_30.SchemaUpdater_25_30; + + +/** + * @author a.mueller + * @created Nov 08, 2010 + * @version 1.0 + */ +public class SchemaUpdater_30_31 extends SchemaUpdaterBase { + + + @SuppressWarnings("unused") + private static final Logger logger = Logger.getLogger(SchemaUpdater_30_31.class); + private static final String startSchemaVersion = "3.0.0.0.201011090000"; + private static final String endSchemaVersion = "3.0.0.1.201101050000"; + +// ********************** FACTORY METHOD ******************************************* + + public static SchemaUpdater_30_31 NewInstance(){ + return new SchemaUpdater_30_31(); + } + + /** + * @param startSchemaVersion + * @param endSchemaVersion + */ + protected SchemaUpdater_30_31() { + super(startSchemaVersion, endSchemaVersion); + } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.database.update.SchemaUpdaterBase#getUpdaterList() + */ + @Override + protected List getUpdaterList() { + + List stepList = new ArrayList(); + String stepName; + + //drop unique index for DefinedTermBase_media.media_id + UniqueIndexDropper step = UniqueIndexDropper.NewInstance("DefinedTermBase_media", "media_id", ! INCLUDE_AUDIT); + stepList.add(step); + + return stepList; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.database.update.SchemaUpdaterBase#getNextUpdater() + */ + @Override + public ISchemaUpdater getNextUpdater() { + return null; + } + + /* (non-Javadoc) + * @see eu.etaxonomy.cdm.database.update.SchemaUpdaterBase#getPreviousUpdater() + */ + @Override + public ISchemaUpdater getPreviousUpdater() { + return SchemaUpdater_25_30.NewInstance(); + } + +}