diff options
author | Martin Taal | 2009-03-19 17:20:14 +0000 |
---|---|---|
committer | Martin Taal | 2009-03-19 17:20:14 +0000 |
commit | c2054ccab9b3c36ed76e02f8184dffe5eca1aabf (patch) | |
tree | ab756946f8f1d7b5846b2605f56db670b8e6e561 /plugins/org.eclipse.emf.cdo.server.hibernate | |
parent | c7791a37c2b42af8a2c5583e77c1d900da0ffd87 (diff) | |
download | cdo-c2054ccab9b3c36ed76e02f8184dffe5eca1aabf.tar.gz cdo-c2054ccab9b3c36ed76e02f8184dffe5eca1aabf.tar.xz cdo-c2054ccab9b3c36ed76e02f8184dffe5eca1aabf.zip |
Solved some issues with the Hibernate Store
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.hibernate')
9 files changed, 449 insertions, 22 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml index 257dac4f16..a9c83a06ee 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml @@ -14,7 +14,7 @@ <property name="timeStamp" access="field" /> <array name="packageInfos" cascade="all, delete-orphan" access="field" inverse="true"> - <key /> + <key column="cdo_package_unit_id"/> <list-index /> <one-to-many class="CDOPackageInfoImpl"/> </array> @@ -27,7 +27,7 @@ <generator class="increment" /> </id> - <many-to-one name="packageUnit" entity-name="CDOPackageUnit" not-null="false" access="field"/> + <many-to-one name="packageUnit" entity-name="CDOPackageUnit" not-null="true" column="cdo_package_unit_id" access="field"/> <property name="packageURI" not-null="true" length="255" access="field" /> <property name="parentURI" length="255" access="field" /> diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/log4j.properties b/plugins/org.eclipse.emf.cdo.server.hibernate/src/log4j.properties index b956a8a902..b2157a5ddb 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/log4j.properties +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/log4j.properties @@ -18,10 +18,10 @@ log4j.logger.org.hibernate=error log4j.logger.org.hibernate.hql.ast.AST=error ### log just the SQL -log4j.logger.org.hibernate.SQL=error +log4j.logger.org.hibernate.SQL=debug ### log JDBC bind parameters ### -log4j.logger.org.hibernate.type=error +log4j.logger.org.hibernate.type=debug #log4j.logger.org.hibernate.type=error ### log schema export/update ### diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java index 058536cf2f..78646b65dc 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernatePackageHandler.java @@ -12,7 +12,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate; import org.eclipse.emf.cdo.common.model.EMFUtil; -import org.eclipse.emf.cdo.server.IStoreAccessor; import org.eclipse.emf.cdo.server.internal.hibernate.bundle.OM; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; @@ -79,21 +78,6 @@ public class HibernatePackageHandler extends Lifecycle public List<EPackage> getEPackages() { List<EPackage> ePackages = new ArrayList<EPackage>(); - if (HibernateThreadContext.isHibernateCommitContextSet()) - { - IStoreAccessor.CommitContext cc = HibernateThreadContext.getHibernateCommitContext().getCommitContext(); - if (cc != null) - { - for (InternalCDOPackageUnit packageUnit : cc.getNewPackageUnits()) - { - for (EPackage ePackage : packageUnit.getEPackages(true)) - { - ePackages.add(ePackage); - } - } - } - } - for (EPackage ePackage : getPackageRegistry().getEPackages()) { ePackages.add(ePackage); @@ -124,7 +108,7 @@ public class HibernatePackageHandler extends Lifecycle // first store and update the new packageunits and the epackages for (InternalCDOPackageUnit packageUnit : packageUnits) { - session.saveOrUpdate("CDOPackageUnit", packageUnit); + session.save("CDOPackageUnit", packageUnit); if (packageUnit.getPackageInfos().length > 0) { @@ -134,7 +118,7 @@ public class HibernatePackageHandler extends Lifecycle final EPackage.Registry registry = hibernateStore.getRepository().getPackageRegistry(); final EPackage rootEPackage = registry.getEPackage(rootNSUri); hbEPackage.setEPackageBlob(EMFUtil.getEPackageBytes(rootEPackage, true, registry)); - session.saveOrUpdate(packageUnit); + session.saveOrUpdate(hbEPackage); } updated = true; @@ -143,6 +127,11 @@ public class HibernatePackageHandler extends Lifecycle tx.commit(); err = false; } + catch (Exception e) + { + e.printStackTrace(System.err); + throw new Error(e); + } finally { if (err) diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java index a00b25299e..3e89ec06f6 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java @@ -25,6 +25,15 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.net4j.util.ObjectUtil; import org.eclipse.net4j.util.WrappedException; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.InternalEObject; + import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; @@ -44,6 +53,8 @@ public class HibernateUtil private static HibernateUtil instance = new HibernateUtil(); + private static String SEPARATOR = "_;_"; + /** * @return the instance */ @@ -266,4 +277,60 @@ public class HibernateUtil final Session session = getHibernateSession(); return (InternalCDORevision)session.get(cdoIDHibernate.getEntityName(), cdoIDHibernate.getId()); } + + public int convertStringToFeatureID(EObject contained, String value) + { + final String[] values = value.split(SEPARATOR); + final String nsuri = values[0]; + final EPackage eContainerPackage = EPackage.Registry.INSTANCE.getEPackage(nsuri); + final String eContainerEClassName = values[1]; + final EClass eContainingClass = (EClass)eContainerPackage.getEClassifier(eContainerEClassName); + + final EPackage eFeaturePackage = EPackage.Registry.INSTANCE.getEPackage(values[2]); + + final String eClassifierName = values[3]; + final EClassifier eClassifier = eFeaturePackage.getEClassifier(eClassifierName); + final EClass eFeatureClass = (EClass)eClassifier; + final String eFeatureName = values[4]; + final EStructuralFeature eFeature = eFeatureClass.getEStructuralFeature(eFeatureName); + return getContainerFeatureId(eContainingClass, contained, eFeature); + } + + private int getContainerFeatureId(EClass containingEClass, EObject contained, EStructuralFeature eFeature) + { + if (eFeature instanceof EAttribute) + { + return InternalEObject.EOPPOSITE_FEATURE_BASE - containingEClass.getFeatureID(eFeature); + + } + final EReference eReference = (EReference)eFeature; + if (eReference.getEOpposite() != null) + { + final EReference containerEReference = eReference.getEOpposite(); + return contained.eClass().getFeatureID(containerEReference); + } + else + { + return InternalEObject.EOPPOSITE_FEATURE_BASE - containingEClass.getFeatureID(eReference); + } + } + + public static String convertEContainerRelationToString(EClass eClass, EStructuralFeature eFeature) + { + StringBuilder result = new StringBuilder(); + { + final String uri = eClass.getEPackage().getNsURI(); + final String eClassifierName = eClass.getName(); + result.append(uri + SEPARATOR + eClassifierName); + } + + { + final String uri = eFeature.getEContainingClass().getEPackage().getNsURI(); + final String eClassName = eFeature.getEContainingClass().getName(); + final String eFeatureName = eFeature.getName(); + result.append(SEPARATOR + uri + SEPARATOR + eClassName + SEPARATOR + eFeatureName); + } + return result.toString(); + } + } diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOContainingFeatureNameGetter.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOContainingFeatureNameGetter.java new file mode 100644 index 0000000000..9814885fce --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOContainingFeatureNameGetter.java @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2004 - 2009 Martin Taal and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Martin Taal - copied from CDORevisionPropertyHandler and adapted + * Eike Stepper - maintenance + */ +package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; + +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; + +import org.hibernate.HibernateException; + +/** + * @author Martin Taal + */ +public class CDOContainingFeatureNameGetter extends CDOPropertyGetter +{ + private static final long serialVersionUID = 1L; + + public CDOContainingFeatureNameGetter(CDORevisionTuplizer tuplizer, String propertyName) + { + super(tuplizer, propertyName); + } + + @Override + public Object get(Object target) throws HibernateException + { + return ((InternalCDORevision)target).getContainingFeatureID(); + } + + @Override + protected boolean isVirtualPropertyAllowed() + { + return true; + } + +} diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOContainingFeatureNameSetter.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOContainingFeatureNameSetter.java new file mode 100644 index 0000000000..fab1170a1f --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOContainingFeatureNameSetter.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2004 - 2009 Martin Taal and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Martin Taal - copied from CDORevisionPropertyHandler and adapted + * Eike Stepper - maintenance + */ +package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; + +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; + +import org.hibernate.HibernateException; +import org.hibernate.engine.SessionFactoryImplementor; + +/** + * @author Martin Taal + */ +public class CDOContainingFeatureNameSetter extends CDOPropertySetter +{ + private static final long serialVersionUID = 1L; + + public CDOContainingFeatureNameSetter(CDORevisionTuplizer tuplizer, String propertyName) + { + super(tuplizer, propertyName); + } + + @Override + public void set(Object target, Object value, SessionFactoryImplementor factory) throws HibernateException + { + final InternalCDORevision revision = (InternalCDORevision)target; + revision.setContainingFeatureID((Integer)value); + } + + @Override + protected boolean isVirtualPropertyAllowed() + { + return true; + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOENumIntegerType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOENumIntegerType.java new file mode 100644 index 0000000000..0a110d960c --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOENumIntegerType.java @@ -0,0 +1,87 @@ +/** + * <copyright> + * + * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands) and others + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Martin Taal + * </copyright> + * + * $Id: CDOENumIntegerType.java,v 1.1 2009-03-19 17:20:14 mtaal Exp $ + */ + +package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; + +import org.eclipse.emf.common.util.Enumerator; +import org.hibernate.HibernateException; + +/** + * Implements the EMF UserType for an Enum in a dynamic model, for an integer field. + * + * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> + * @version $Revision: 1.1 $ $Date: 2009-03-19 17:20:14 $ + */ + +public class CDOENumIntegerType extends CDOENumStringType { + + /** The sql types used for enums */ + private static final int[] SQL_TYPES = new int[] { Types.INTEGER }; + + /** Hashmap with string to enum mappings */ + private final HashMap<Integer, Enumerator> localCache = new HashMap<Integer, Enumerator>(); + + /* + * (non-Javadoc) + * + * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], + * java.lang.Object) + */ + @Override + public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException { + final int value = rs.getInt(names[0]); + if (rs.wasNull()) { + return null; + } + + Integer objValue = new Integer(value); + Enumerator enumValue = localCache.get(objValue); + if (enumValue != null) { + return enumValue; + } + + enumValue = enumInstance.getEEnumLiteral(objValue.intValue()); + localCache.put(objValue, enumValue); + return enumValue; + } + + /* + * (non-Javadoc) + * + * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, + * java.lang.Object, int) + */ + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException { + if (value == null) { + st.setNull(index, Types.INTEGER); + } else { + st.setInt(index, ((Enumerator) value).getValue()); + } + } + + /** An enum is stored in one varchar */ + @Override + public int[] sqlTypes() { + return SQL_TYPES; + } +}
\ No newline at end of file diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOENumStringType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOENumStringType.java new file mode 100644 index 0000000000..7835cfad4d --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOENumStringType.java @@ -0,0 +1,190 @@ +/** + * <copyright> + * + * Copyright (c) 2009 Springsite BV (The Netherlands) and others + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Martin Taal + * </copyright> + * + * $Id: CDOENumStringType.java,v 1.1 2009-03-19 17:20:14 mtaal Exp $ + */ + +package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; + +import org.eclipse.emf.common.util.Enumerator; +import org.eclipse.emf.ecore.EEnum; +import org.eclipse.emf.ecore.EPackage; + +import org.hibernate.HibernateException; +import org.hibernate.usertype.ParameterizedType; +import org.hibernate.usertype.UserType; + +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.HashMap; +import java.util.Properties; + +/** + * Implements the EMF UserType for an Enum + * + * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> + * @version $Revision: 1.1 $ $Date: 2009-03-19 17:20:14 $ + */ + +public class CDOENumStringType implements UserType, ParameterizedType +{ + /** The sql types used for enums */ + private static final int[] SQL_TYPES = new int[] { Types.VARCHAR }; + + /** The enum type we are handling here */ + protected EEnum enumInstance; + + /** Hashmap with string to enum mappings */ + private final HashMap<String, Enumerator> localCache = new HashMap<String, Enumerator>(); + + /* + * (non-Javadoc) + * @see org.hibernate.usertype.UserType#assemble(java.io.Serializable, java.lang.Object) + */ + public Object assemble(Serializable cached, Object owner) throws HibernateException + { + return cached; + } + + /* + * (non-Javadoc) + * @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object) + */ + public Object deepCopy(Object value) throws HibernateException + { + return value; + } + + /* + * (non-Javadoc) + * @see org.hibernate.usertype.UserType#disassemble(java.lang.Object) + */ + public Serializable disassemble(Object value) throws HibernateException + { + return (Serializable)value; + } + + /** Compares the int values of the enumerates */ + public boolean equals(Object x, Object y) throws HibernateException + { + // todo: check compare on null values + if (x == null && y == null) + { + return true; + } + + if (x == null || y == null) + { + return false; + } + + if (x.getClass() != y.getClass()) + { + return false; + } + return ((Enumerator)x).getValue() == ((Enumerator)y).getValue(); + } + + /* + * (non-Javadoc) + * @see org.hibernate.usertype.UserType#hashCode(java.lang.Object) + */ + public int hashCode(Object x) throws HibernateException + { + return x.hashCode(); + } + + /** Not mutable */ + public boolean isMutable() + { + return false; + } + + /* + * (non-Javadoc) + * @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object) + */ + public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException + { + final String name = rs.getString(names[0]); + if (rs.wasNull()) + { + return null; + } + + Enumerator enumValue = localCache.get(name); + if (enumValue != null) + { + return enumValue; + } + + enumValue = enumInstance.getEEnumLiteralByLiteral(name.trim()); + if (enumValue == null) + { + throw new IllegalStateException("The enum value " + name + " is not valid for enumerator: " + + enumInstance.getName()); + } + localCache.put(name, enumValue); + return enumValue; + } + + /* + * (non-Javadoc) + * @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int) + */ + public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException + { + if (value == null) + { + st.setNull(index, Types.VARCHAR); + } + else + { + st.setString(index, ((Enumerator)value).getName()); + } + } + + /* + * (non-Javadoc) + * @see org.hibernate.usertype.UserType#replace(java.lang.Object, java.lang.Object, java.lang.Object) + */ + public Object replace(Object original, Object target, Object owner) throws HibernateException + { + return original; + } + + /** Returns the parameterizezd enumType */ + public Class<?> returnedClass() + { + return enumInstance.getClass(); + } + + /** An enum is stored in one varchar */ + public int[] sqlTypes() + { + return SQL_TYPES; + } + + /** Sets the enumclass */ + public void setParameterValues(Properties parameters) + { + // TODO: externalize + final String epackUri = parameters.getProperty("epackage"); + final String eclassifier = parameters.getProperty("eclassifier"); + final EPackage epack = EPackage.Registry.INSTANCE.getEPackage(epackUri); + enumInstance = (EEnum)epack.getEClassifier(eclassifier); + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java index 9e60117880..b0772fea7a 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionTuplizer.java @@ -217,6 +217,10 @@ public class CDORevisionTuplizer extends AbstractEntityTuplizer { return new CDOContainingFeatureIDGetter(this, mappedProperty.getName()); } + else if (mappedProperty.getName().compareTo("containingFeatureName") == 0) + { + return new CDOContainingFeatureIDGetter(this, mappedProperty.getName()); + } EStructuralFeature feature = getEClass().getEStructuralFeature(mappedProperty.getName()); if (feature instanceof EReference && feature.isMany()) @@ -271,6 +275,11 @@ public class CDORevisionTuplizer extends AbstractEntityTuplizer return new CDOContainingFeatureIDSetter(this, mappedProperty.getName()); } + if (mappedProperty.getName().compareTo("containingFeatureName") == 0) + { + return new CDOContainingFeatureIDSetter(this, mappedProperty.getName()); + } + EStructuralFeature feature = getEClass().getEStructuralFeature(mappedProperty.getName()); if (feature instanceof EReference && feature.isMany()) { |