Hibernate SVN: r10260 - trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-08-14 10:37:33 -0400 (Mon, 14 Aug 2006)
New Revision: 10260
Modified:
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java
Log:
vno
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java 2006-08-14 14:29:27 UTC (rev 10259)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java 2006-08-14 14:37:33 UTC (rev 10260)
@@ -5,7 +5,7 @@
final public class Version {
- public static final String VERSION = "3.2.0.beta6a";
+ public static final String VERSION = "3.2.0.beta7";
private static final Version instance = new Version();
17 years, 9 months
Hibernate SVN: r10259 - trunk/HibernateExt/tools
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-08-14 10:29:27 -0400 (Mon, 14 Aug 2006)
New Revision: 10259
Modified:
trunk/HibernateExt/tools/build.xml
Log:
vno
Modified: trunk/HibernateExt/tools/build.xml
===================================================================
--- trunk/HibernateExt/tools/build.xml 2006-08-14 14:29:04 UTC (rev 10258)
+++ trunk/HibernateExt/tools/build.xml 2006-08-14 14:29:27 UTC (rev 10259)
@@ -7,7 +7,7 @@
<!-- Name of project and version, used to create filenames -->
<property name="Name" value="Hibernate Tools"/>
<property name="name" value="hibernate-tools"/>
- <property name="version" value="3.2.0beta6a"/>
+ <property name="version" value="3.2.0beta7"/>
<property name="javadoc.packagenames" value="org.hibernate.tool"/>
17 years, 9 months
Hibernate SVN: r10258 - trunk/HibernateExt/tools
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-08-14 10:29:04 -0400 (Mon, 14 Aug 2006)
New Revision: 10258
Modified:
trunk/HibernateExt/tools/build.xml
Log:
vno
Modified: trunk/HibernateExt/tools/build.xml
===================================================================
--- trunk/HibernateExt/tools/build.xml 2006-08-14 14:28:39 UTC (rev 10257)
+++ trunk/HibernateExt/tools/build.xml 2006-08-14 14:29:04 UTC (rev 10258)
@@ -7,7 +7,7 @@
<!-- Name of project and version, used to create filenames -->
<property name="Name" value="Hibernate Tools"/>
<property name="name" value="hibernate-tools"/>
- <property name="version" value="3.2.0beta6"/>
+ <property name="version" value="3.2.0beta6a"/>
<property name="javadoc.packagenames" value="org.hibernate.tool"/>
17 years, 9 months
Hibernate SVN: r10257 - trunk/HibernateExt/tools
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-08-14 10:28:39 -0400 (Mon, 14 Aug 2006)
New Revision: 10257
Modified:
trunk/HibernateExt/tools/changelog.txt
Log:
changelog with correct number
Modified: trunk/HibernateExt/tools/changelog.txt
===================================================================
--- trunk/HibernateExt/tools/changelog.txt 2006-08-14 14:28:25 UTC (rev 10256)
+++ trunk/HibernateExt/tools/changelog.txt 2006-08-14 14:28:39 UTC (rev 10257)
@@ -1,6 +1,12 @@
Hibernate Tools Changelog
=========================
+Changes in version 3.2alpha7
+----------------------------
+
+Changes in version 3.1alpha6
+----------------------------
+
Changes in version 3.1alpha5
----------------------------
17 years, 9 months
Hibernate SVN: r10256 - trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-08-14 10:28:25 -0400 (Mon, 14 Aug 2006)
New Revision: 10256
Added:
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/JavaTypeFromValueVisitor.java
Log:
missing added files for:
detect many-to-many and optimstic lock setting exposed on ant task.
mix fixes/cleanup
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java 2006-08-14 14:26:14 UTC (rev 10255)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java 2006-08-14 14:28:25 UTC (rev 10256)
@@ -0,0 +1,30 @@
+package org.hibernate.tool.hbm2x.visitor;
+
+import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.OneToMany;
+import org.hibernate.mapping.OneToOne;
+import org.hibernate.mapping.ToOne;
+
+public class EntityNameFromValueVisitor extends DefaultValueVisitor {
+
+ public EntityNameFromValueVisitor() {
+ super( true );
+ }
+
+ public Object accept(OneToOne o) {
+ return acceptToOne(o);
+ }
+
+ public Object accept(ManyToOne o) {
+ return acceptToOne(o);
+ }
+
+ private Object acceptToOne(ToOne value) {
+ return value.getReferencedEntityName(); // should get the cfg and lookup the persistenclass.
+ }
+
+ public Object accept(OneToMany value) {
+ return value.getAssociatedClass().getEntityName();
+ }
+
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/JavaTypeFromValueVisitor.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/JavaTypeFromValueVisitor.java 2006-08-14 14:26:14 UTC (rev 10255)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/JavaTypeFromValueVisitor.java 2006-08-14 14:28:25 UTC (rev 10256)
@@ -0,0 +1,84 @@
+package org.hibernate.tool.hbm2x.visitor;
+
+import org.hibernate.HibernateException;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.OneToMany;
+import org.hibernate.mapping.OneToOne;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.ToOne;
+import org.hibernate.mapping.Value;
+import org.hibernate.tool.hbm2x.Cfg2JavaTool;
+import org.hibernate.type.CompositeCustomType;
+import org.hibernate.type.CustomType;
+import org.hibernate.type.Type;
+
+public class JavaTypeFromValueVisitor extends DefaultValueVisitor {
+
+
+ private boolean preferRawTypeNames = true;
+
+ public JavaTypeFromValueVisitor() {
+ super( true );
+ }
+
+ public Object accept(Component value) {
+ // composite-element breaks without it.
+ return value.getComponentClassName();
+ }
+
+ public Object accept(OneToOne o) {
+ return acceptToOne(o);
+ }
+
+ public Object accept(ManyToOne o) {
+ return acceptToOne(o);
+ }
+
+ private Object acceptToOne(ToOne value) {
+ return value.getReferencedEntityName(); // should get the cfg and lookup the persistenclass.
+ }
+
+ public Object accept(OneToMany value) {
+ return value.getAssociatedClass().getClassName();
+ }
+
+ private String toName(Class c) {
+
+ if ( c.isArray() ) {
+ Class a = c.getComponentType();
+
+ return a.getName() + "[]";
+ }
+ else {
+ return c.getName();
+ }
+ }
+
+ protected Object handle(Object o) {
+ Value value = (Value) o;
+ try {
+ // have to attempt calling gettype to decide if its custom type.
+ Type type = value.getType();
+ if(type instanceof CustomType || type instanceof CompositeCustomType) {
+ return toName( type.getReturnedClass() );
+ }
+ } catch(HibernateException he) {
+ // ignore
+ }
+
+ if ( preferRawTypeNames && value.isSimpleValue() ) {
+ // this logic make us use the raw typename if it is something else than an Hibernate type. So, if user wrote long we will use long...if he meant to have a Long then he should use the java.lang.Long version.
+ String typename = ( (SimpleValue) value ).getTypeName();
+ if ( !Cfg2JavaTool.isNonPrimitiveTypeName( typename ) ) {
+ String val = ( (SimpleValue) value ).getTypeName();
+ if(val!=null) return val; // val can be null when type is any
+ }
+ }
+
+ return toName( value.getType().getReturnedClass() );
+
+ }
+
+
+}
17 years, 9 months
Hibernate SVN: r10255 - in trunk/HibernateExt/tools/src: java/org/hibernate/cfg java/org/hibernate/cfg/reveng java/org/hibernate/tool/ant java/org/hibernate/tool/hbm2x java/org/hibernate/tool/hbm2x/visitor templates/dao test/org/hibernate/tool/test/jdbc2cfg
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-08-14 10:26:14 -0400 (Mon, 14 Aug 2006)
New Revision: 10255
Modified:
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2JavaTool.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/DefaultValueVisitor.java
trunk/HibernateExt/tools/src/templates/dao/daohome.ftl
trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/ManyToManyTest.java
Log:
detect many-to-many and optimstic lock setting exposed on ant task.
mix fixes/cleanup
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-08-14 14:26:14 UTC (rev 10255)
@@ -258,7 +258,7 @@
}
if(keys.size()>1) {
- throw new JDBCBinderException("more than one other foreign key to choose from!"); // todo: hande better ?
+ throw new JDBCBinderException("more than one other foreign key to choose from!"); // todo: handle better ?
}
ForeignKey fk = (ForeignKey) keys.get( 0 );
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-08-14 14:26:14 UTC (rev 10255)
@@ -160,7 +160,7 @@
}
public boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) {
- if(settings.hasAutoOptimisticLockDetection()) {
+ if(settings.getDetectOptimsticLock()) {
return AUTO_OPTIMISTICLOCK_COLUMNS.contains(column.toLowerCase())?true:false;
} else {
return false;
@@ -200,16 +200,19 @@
}
public boolean isManyToManyTable(Table table) {
- if(settings.getAutoManyToManyDetection()) {
+ if(settings.getDetectManyToMany()) {
Iterator foreignKeyIterator = table.getForeignKeyIterator();
List foreignKeys = new ArrayList();
while ( foreignKeyIterator.hasNext() ) {
ForeignKey fkey = (ForeignKey) foreignKeyIterator.next();
foreignKeys.add( fkey );
if(foreignKeys.size()>2) {
- return false; // early exit if we have more than one fk.
+ return false; // early exit if we have more than two fk.
}
}
+/* if(foreignKeys.size()!=2) {
+ return false;
+ }*/
Set columns = new HashSet();
Iterator columnIterator = table.getColumnIterator();
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java 2006-08-14 14:26:14 UTC (rev 10255)
@@ -6,10 +6,10 @@
//final ReverseEngineeringStrategy rootStrategy;
private String defaultPackageName = "";
- private boolean autoOptimisticLockDetection = true;
+ private boolean detectOptimisticLock = true;
private boolean createCollectionForForeignKey = true;
private boolean createManyToOneForForeignKey = true;
- private boolean autoManyToManyDetection;
+ private boolean detectManyToMany = true;
//public ReverseEngineeringSettings(ReverseEngineeringStrategy rootStrategy) {
// this.rootStrategy = rootStrategy;
@@ -30,13 +30,14 @@
}
/** If true, reverse engineering strategy will try and autodetect columns for optimistc locking, e.g. VERSION and TIMESTAMP */
- public boolean hasAutoOptimisticLockDetection() {
- return autoOptimisticLockDetection ;
+ public boolean getDetectOptimsticLock() {
+ return detectOptimisticLock ;
}
- public void setAutoOptimisticLockDetection(
+ public ReverseEngineeringSettings setDetectOptimisticLock(
boolean optimisticLockSupportEnabled) {
- this.autoOptimisticLockDetection = optimisticLockSupportEnabled;
+ this.detectOptimisticLock = optimisticLockSupportEnabled;
+ return this;
}
/** if true, a collection will be mapped for each foreignkey */
@@ -62,13 +63,13 @@
return this;
}
- public ReverseEngineeringSettings setAutoManyToManyDetection(boolean b) {
- this.autoManyToManyDetection = b;
+ public ReverseEngineeringSettings setDetectManyToMany(boolean b) {
+ this.detectManyToMany = b;
return this;
}
- public boolean getAutoManyToManyDetection() {
- return autoManyToManyDetection;
+ public boolean getDetectManyToMany() {
+ return detectManyToMany;
}
/** return the top/root strategy. Allows a lower strategy to ask another question. Dangerous to do since recursive loops can easily occur! */
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/JDBCConfigurationTask.java 2006-08-14 14:26:14 UTC (rev 10255)
@@ -31,6 +31,10 @@
private String reverseEngineeringStrategyClass;
private String packageName;
private Path revengFiles;
+
+ private boolean detectManyToMany;
+
+ private boolean detectOptimisticLock;
public JDBCConfigurationTask() {
setDescription("JDBC Configuration (for reverse engineering)");
@@ -49,7 +53,10 @@
jmdc.setPreferBasicCompositeIds(preferBasicCompositeIds);
DefaultReverseEngineeringStrategy defaultStrategy = new DefaultReverseEngineeringStrategy();
- ReverseEngineeringSettings qqsettings = new ReverseEngineeringSettings().setDefaultPackageName(packageName);
+ ReverseEngineeringSettings qqsettings =
+ new ReverseEngineeringSettings().setDefaultPackageName(packageName)
+ .setDetectManyToMany( detectManyToMany )
+ .setDetectOptimisticLock( detectOptimisticLock );
if(packageName!=null) {
defaultStrategy.setSettings(qqsettings);
@@ -93,6 +100,14 @@
preferBasicCompositeIds = b;
}
+ public void setDetectManyToMany(boolean b) {
+ detectManyToMany = b;
+ }
+
+ public void setDetectOptimisticLock(boolean b) {
+ detectOptimisticLock = b;
+ }
+
private ReverseEngineeringStrategy loadreverseEngineeringStrategy(final String className, ReverseEngineeringStrategy delegate)
throws BuildException {
try {
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2JavaTool.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2JavaTool.java 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2JavaTool.java 2006-08-14 14:26:14 UTC (rev 10255)
@@ -35,6 +35,7 @@
import org.hibernate.tool.hbm2x.pojo.ImportContext;
import org.hibernate.tool.hbm2x.pojo.NoopImportContext;
import org.hibernate.tool.hbm2x.pojo.POJOClass;
+import org.hibernate.tool.hbm2x.visitor.JavaTypeFromValueVisitor;
import org.hibernate.type.CompositeCustomType;
import org.hibernate.type.CustomType;
import org.hibernate.type.PrimitiveType;
@@ -206,7 +207,7 @@
private static Set NONPRIMITIVETYPES = null;
- boolean isNonPrimitiveTypeName(String typeName) {
+ static public boolean isNonPrimitiveTypeName(String typeName) {
if ( NONPRIMITIVETYPES == null ) {
NONPRIMITIVETYPES = new HashSet();
Field[] fields = Hibernate.class.getFields();
@@ -297,6 +298,7 @@
}
private String getJavaTypeName(Value value, boolean preferRawTypeNames) {
+ if(true) return (String) value.accept( new JavaTypeFromValueVisitor() );
if ( value instanceof Component) {
// composite-element breaks without it.
return ((Component)value).getComponentClassName();
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/DefaultValueVisitor.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/DefaultValueVisitor.java 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/DefaultValueVisitor.java 2006-08-14 14:26:14 UTC (rev 10255)
@@ -35,7 +35,7 @@
this.throwException = throwException;
}
- Object handle(Object o) {
+ protected Object handle(Object o) {
if (throwException) {
throw new UnsupportedOperationException("accept on " + o);
}
Modified: trunk/HibernateExt/tools/src/templates/dao/daohome.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/dao/daohome.ftl 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/templates/dao/daohome.ftl 2006-08-14 14:26:14 UTC (rev 10255)
@@ -54,6 +54,7 @@
}
}
+<#if clazz.identifierProperty?has_content>
public ${declarationName} findById( ${pojo.getJavaTypeName(clazz.identifierProperty, jdk5)} id) {
log.debug("getting ${declarationName} instance with id: " + id);
try {
@@ -66,6 +67,7 @@
throw re;
}
}
+</#if>
<#else>
private final ${pojo.importType("org.hibernate.SessionFactory")} sessionFactory = getSessionFactory();
@@ -141,6 +143,7 @@
}
}
+<#if clazz.identifierProperty?has_content>
public ${declarationName} findById( ${c2j.getJavaTypeName(clazz.identifierProperty, jdk5)} id) {
log.debug("getting ${declarationName} instance with id: " + id);
try {
@@ -159,6 +162,7 @@
throw re;
}
}
+</#if>
<#if clazz.hasNaturalId()>
public ${declarationName} findByNaturalId(${c2j.asNaturalIdParameterList(clazz)}) {
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/ManyToManyTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/ManyToManyTest.java 2006-08-14 10:20:21 UTC (rev 10254)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/ManyToManyTest.java 2006-08-14 14:26:14 UTC (rev 10255)
@@ -42,7 +42,7 @@
localCfg = new JDBCMetaDataConfiguration();
DefaultReverseEngineeringStrategy c = new DefaultReverseEngineeringStrategy();
- c.setSettings(new ReverseEngineeringSettings().setAutoManyToManyDetection(true));
+ c.setSettings(new ReverseEngineeringSettings().setDetectManyToMany(false));
localCfg.setReverseEngineeringStrategy(c);
localCfg.readFromJDBC();
}
@@ -52,16 +52,16 @@
super.tearDown();
}
- public void testDefaultBiDirectional() {
+ public void testNoManyToManyBiDirectional() {
- PersistentClass project = cfg.getClassMapping("Project");
+ PersistentClass project = localCfg.getClassMapping("Project");
assertNotNull(project.getProperty("worksOns"));
//assertNotNull(project.getProperty("employee"));
assertEquals(3, project.getPropertyClosureSpan());
assertEquals("projectId", project.getIdentifierProperty().getName());
- PersistentClass employee = cfg.getClassMapping("Employee");
+ PersistentClass employee = localCfg.getClassMapping("Employee");
assertNotNull(employee.getProperty("worksOns"));
assertNotNull(employee.getProperty("employees"));
@@ -70,7 +70,7 @@
assertEquals(6, employee.getPropertyClosureSpan());
assertEquals("id", employee.getIdentifierProperty().getName());
- PersistentClass worksOn = cfg.getClassMapping("WorksOn");
+ PersistentClass worksOn = localCfg.getClassMapping("WorksOn");
assertNotNull(worksOn.getProperty("project"));
assertNotNull(worksOn.getProperty("employee"));
@@ -80,14 +80,14 @@
public void testAutoCreation() {
- assertNull("No middle class should be generated.", localCfg.getClassMapping( "WorksOn" ));
+ assertNull("No middle class should be generated.", cfg.getClassMapping( "WorksOn" ));
- assertNotNull("Should create worksontext since one of the foreign keys is not part of pk", localCfg.getClassMapping( "WorksOnContext" ));
+ assertNotNull("Should create worksontext since one of the foreign keys is not part of pk", cfg.getClassMapping( "WorksOnContext" ));
- PersistentClass projectClass = localCfg.getClassMapping("Project");
+ PersistentClass projectClass = cfg.getClassMapping("Project");
assertNotNull( projectClass );
- PersistentClass employeeClass = localCfg.getClassMapping("Employee");
+ PersistentClass employeeClass = cfg.getClassMapping("Employee");
assertNotNull( employeeClass );
assertPropertyNotExist( projectClass, "worksOns" );
@@ -106,9 +106,9 @@
public void testGenerateAndReadable() {
- localCfg.buildMappings();
+ cfg.buildMappings();
- HibernateMappingExporter hme = new HibernateMappingExporter(localCfg, getOutputDir());
+ HibernateMappingExporter hme = new HibernateMappingExporter(cfg, getOutputDir());
hme.start();
assertFileAndExists( new File(getOutputDir(), "Employee.hbm.xml") );
17 years, 9 months
Hibernate SVN: r10254 - trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-08-14 06:20:21 -0400 (Mon, 14 Aug 2006)
New Revision: 10254
Modified:
trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/SchemaExport.java
Log:
line no info with import.sql
Modified: trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/SchemaExport.java
===================================================================
--- trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/SchemaExport.java 2006-08-14 00:19:48 UTC (rev 10253)
+++ trunk/Hibernate3/src/org/hibernate/tool/hbm2ddl/SchemaExport.java 2006-08-14 10:20:21 UTC (rev 10254)
@@ -237,8 +237,10 @@
throws IOException {
log.info( "Executing import script: " + importFile );
BufferedReader reader = new BufferedReader( importFileReader );
+ long lineNo = 0;
for ( String sql = reader.readLine(); sql != null; sql = reader.readLine() ) {
try {
+ lineNo++;
String trimmedSql = sql.trim();
if ( trimmedSql.length() == 0 ||
trimmedSql.startsWith( "--" ) ||
@@ -255,7 +257,7 @@
}
}
catch ( SQLException e ) {
- throw new JDBCException( "Error during import script execution", e );
+ throw new JDBCException( "Error during import script execution at line " + lineNo, e );
}
}
}
17 years, 9 months
Hibernate SVN: r10253 - in trunk/HibernateExt/metadata: lib src/java/org/hibernate/annotations src/java/org/hibernate/cfg src/java/org/hibernate/cfg/annotations src/java/org/hibernate/reflection/java src/test/org/hibernate/test/annotations src/test/org/hibernate/test/annotations/identifiercollection
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2006-08-13 20:19:48 -0400 (Sun, 13 Aug 2006)
New Revision: 10253
Added:
trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/CollectionId.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java
Modified:
trunk/HibernateExt/metadata/lib/ejb3-persistence.jar
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/BinderHelper.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/IndexColumn.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/OneToOneSecondPass.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/TableBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java
Log:
ANN-39 introduce @CollectionId
ANN-412 Ejb3OverridenAnnotationReader field used to swallow generators annotations
Modified: trunk/HibernateExt/metadata/lib/ejb3-persistence.jar
===================================================================
(Binary files differ)
Added: trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/CollectionId.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/CollectionId.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/annotations/CollectionId.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+import javax.persistence.Column;
+
+/**
+ * Describe an identifier column for a bag (ie an idbag)
+ * EXPERIMENTAL: the structure of this annotation might slightly change (generator() mix strategy and generator
+ *
+ * @author Emmanuel Bernard
+ */
+@Target({METHOD, FIELD})
+@Retention(RUNTIME)
+public @interface CollectionId {
+ /** Collection id column(s) */
+ Column[] columns();
+ /** id type, type.type() must be set */
+ Type type();
+ /** generator name: 'identity' or a defined generator name */
+ String generator();
+}
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -85,6 +85,7 @@
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.hibernate.annotations.Where;
+import org.hibernate.annotations.CollectionId;
import org.hibernate.cfg.annotations.CollectionBinder;
import org.hibernate.cfg.annotations.EntityBinder;
import org.hibernate.cfg.annotations.Nullability;
@@ -109,7 +110,6 @@
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.SingleTableSubclass;
import org.hibernate.mapping.Subclass;
-import org.hibernate.mapping.Table;
import org.hibernate.mapping.ToOne;
import org.hibernate.mapping.UnionSubclass;
import org.hibernate.persister.entity.JoinedSubclassEntityPersister;
@@ -133,7 +133,6 @@
* @author Emmanuel Bernard
*/
public final class AnnotationBinder {
- public static final String ANNOTATION_STRING_DEFAULT = "";
/*
* Some design description
@@ -303,24 +302,24 @@
idGen.setName( tabGen.name() );
idGen.setIdentifierGeneratorStrategy( MultipleHiLoPerTableGenerator.class.getName() );
- if ( !isDefault( tabGen.table() ) ) {
+ if ( ! BinderHelper.isDefault( tabGen.table() ) ) {
idGen.addParam( MultipleHiLoPerTableGenerator.ID_TABLE, tabGen.table() );
}
- if ( ! isDefault( tabGen.catalog() ) ) {
+ if ( ! BinderHelper.isDefault( tabGen.catalog() ) ) {
idGen.addParam( MultipleHiLoPerTableGenerator.CATALOG, tabGen.catalog() );
}
- if ( ! isDefault( tabGen.schema() ) ) {
+ if ( ! BinderHelper.isDefault( tabGen.schema() ) ) {
idGen.addParam( MultipleHiLoPerTableGenerator.SCHEMA, tabGen.schema() );
}
//FIXME implements uniqueconstrains
- if ( ! isDefault( tabGen.pkColumnName() ) ) {
+ if ( ! BinderHelper.isDefault( tabGen.pkColumnName() ) ) {
idGen.addParam( MultipleHiLoPerTableGenerator.PK_COLUMN_NAME, tabGen.pkColumnName() );
}
- if ( ! isDefault( tabGen.valueColumnName() ) ) {
+ if ( ! BinderHelper.isDefault( tabGen.valueColumnName() ) ) {
idGen.addParam( MultipleHiLoPerTableGenerator.VALUE_COLUMN_NAME, tabGen.valueColumnName() );
}
- if ( !isDefault( tabGen.pkColumnValue() ) ) {
+ if ( ! BinderHelper.isDefault( tabGen.pkColumnValue() ) ) {
idGen.addParam( MultipleHiLoPerTableGenerator.PK_VALUE_NAME, tabGen.pkColumnValue() );
}
idGen.addParam( TableHiLoGenerator.MAX_LO, String.valueOf( tabGen.allocationSize() - 1 ) );
@@ -331,7 +330,7 @@
idGen.setName( seqGen.name() );
idGen.setIdentifierGeneratorStrategy( "seqhilo" );
- if ( ! isDefault( seqGen.sequenceName() ) ) {
+ if ( ! BinderHelper.isDefault( seqGen.sequenceName() ) ) {
idGen.addParam( org.hibernate.id.SequenceGenerator.SEQUENCE, seqGen.sequenceName() );
}
//FIXME: work on initialValue() through SequenceGenerator.PARAMETERS
@@ -645,7 +644,7 @@
boolean propertyAnnotated = entityBinder.isPropertyAnnotated( compositeClass );
String propertyAccessor = entityBinder.getPropertyAccessor( compositeClass );
String generatorType = "assigned";
- String generator = ANNOTATION_STRING_DEFAULT;
+ String generator = BinderHelper.ANNOTATION_STRING_DEFAULT;
PropertyData inferredData = new PropertyPreloadedData(
entityBinder.getPropertyAccessor(), "id", compositeClass
);
@@ -1164,7 +1163,7 @@
GeneratedValue generatedValue = property.getAnnotation( GeneratedValue.class );
String generatorType = generatedValue != null ? generatorType( generatedValue.strategy() ) : "assigned";
- String generator = generatedValue != null ? generatedValue.generator() : ANNOTATION_STRING_DEFAULT;
+ String generator = generatedValue != null ? generatedValue.generator() : BinderHelper.ANNOTATION_STRING_DEFAULT;
if ( isComponent ) generatorType = "assigned"; //a component must not have any generator
Type typeAnn = property.getAnnotation( Type.class );
bindId(
@@ -1309,7 +1308,7 @@
);
CollectionBinder collectionBinder = CollectionBinder.getCollectionBinder(
propertyHolder.getEntityName(),
- inferredData,
+ property,
! indexColumn.isImplicit()
);
collectionBinder.setIndexColumn( indexColumn );
@@ -1466,7 +1465,14 @@
collectionBinder.setInsertable( false );
collectionBinder.setUpdatable( false );
}
+ if ( property.isAnnotationPresent( CollectionId.class ) ) { //do not compute the generators unless necessary
+ HashMap<String, IdGenerator> localGenerators = (HashMap<String, IdGenerator>) classGenerators.clone();
+ localGenerators.putAll( buildLocalGenerators( property, mappings ) );
+ collectionBinder.setLocalGenerators(localGenerators);
+
+ }
collectionBinder.bind();
+
}
else {
//define whether the type is a component or not
@@ -1534,9 +1540,9 @@
JoinColumn[] annInverseJoins;
if ( joinTableAnn != null ) {
collectionBinder.setExplicitAssociationTable( true );
- if ( ! isDefault( joinTableAnn.schema() ) ) associationTableBinder.setSchema( joinTableAnn.schema() );
- if ( ! isDefault( joinTableAnn.catalog() ) ) associationTableBinder.setCatalog( joinTableAnn.catalog() );
- if ( ! isDefault( joinTableAnn.name() ) ) associationTableBinder.setName( joinTableAnn.name() );
+ if ( ! BinderHelper.isDefault( joinTableAnn.schema() ) ) associationTableBinder.setSchema( joinTableAnn.schema() );
+ if ( ! BinderHelper.isDefault( joinTableAnn.catalog() ) ) associationTableBinder.setCatalog( joinTableAnn.catalog() );
+ if ( ! BinderHelper.isDefault( joinTableAnn.name() ) ) associationTableBinder.setName( joinTableAnn.name() );
associationTableBinder.setUniqueConstraints( joinTableAnn.uniqueConstraints() );
//set check constaint in the second pass
@@ -1700,47 +1706,7 @@
id = value.make();
}
rootClass.setIdentifier( id );
- Table table = id.getTable();
- table.setIdentifierValue( id );
- //generator settings
- id.setIdentifierGeneratorStrategy( generatorType );
- Properties params = new Properties();
- //always settable
- params.setProperty(
- PersistentIdentifierGenerator.TABLE, table.getName()
- );
-
- if ( id.getColumnSpan() == 1 ) {
- params.setProperty(
- PersistentIdentifierGenerator.PK,
- ( (org.hibernate.mapping.Column) id.getColumnIterator().next() ).getName()
- );
- }
- if ( ! isDefault( generatorName ) ) {
- //we have a named generator
- IdGenerator gen = mappings.getGenerator( generatorName, localGenerators );
- if ( gen == null ) {
- throw new AnnotationException( "Unknown Id.generator: " + generatorName );
- }
- //This is quite vague in the spec but a generator could override the generate choice
- String identifierGeneratorStrategy = gen.getIdentifierGeneratorStrategy();
- //yuk! this is a hack not to override 'AUTO' even if generator is set
- final boolean avoidOverriding =
- identifierGeneratorStrategy.equals( "identity" )
- || identifierGeneratorStrategy.equals( "seqhilo" )
- || identifierGeneratorStrategy.equals( MultipleHiLoPerTableGenerator.class.getName() );
- if ( ! avoidOverriding ) {
- id.setIdentifierGeneratorStrategy( identifierGeneratorStrategy );
- }
- //checkIfMatchingGenerator(gen, generatorType, generatorName);
- Iterator genParams = gen.getParams().entrySet().iterator();
- while ( genParams.hasNext() ) {
- Map.Entry elt = (Map.Entry) genParams.next();
- params.setProperty( (String) elt.getKey(), (String) elt.getValue() );
- }
- }
- if ( generatorType == "assigned" ) id.setNullValue( "undefined" );
- id.setIdentifierGeneratorProperties( params );
+ BinderHelper.makeIdGenerator( id, generatorType, generatorName, mappings, localGenerators );
if ( isEmbedded ) {
rootClass.setEmbeddedIdentifier( inferredData.getPropertyClass() == null );
}
@@ -1891,7 +1857,7 @@
}
}
}
- if ( trueOneToOne || mapToPK || ! isDefault( mappedBy ) ) {
+ if ( trueOneToOne || mapToPK || ! BinderHelper.isDefault( mappedBy ) ) {
//is a true one-to-one
//FIXME referencedColumnName ignored => ordering may fail.
mappings.addSecondPass(
@@ -2038,10 +2004,6 @@
return generators;
}
- public static boolean isDefault(String annotationString) {
- return ANNOTATION_STRING_DEFAULT.equals( annotationString );
- }
-
public static boolean isDefault(XClass clazz, ExtendedMappings mappings) {
return mappings.getReflectionManager().equals( clazz, void.class );
}
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/BinderHelper.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/BinderHelper.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/BinderHelper.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -10,10 +10,13 @@
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
+import java.util.Properties;
import org.hibernate.AnnotationException;
import org.hibernate.AssertionFailure;
import org.hibernate.MappingException;
+import org.hibernate.id.PersistentIdentifierGenerator;
+import org.hibernate.id.MultipleHiLoPerTableGenerator;
import org.hibernate.cfg.annotations.TableBinder;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Column;
@@ -24,12 +27,17 @@
import org.hibernate.mapping.Table;
import org.hibernate.mapping.ToOne;
import org.hibernate.mapping.Value;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.IdGenerator;
import org.hibernate.util.StringHelper;
/**
* @author Emmanuel Bernard
*/
public class BinderHelper {
+
+ public static final String ANNOTATION_STRING_DEFAULT = "";
+
private BinderHelper() {
}
@@ -351,4 +359,56 @@
while ( !found && current != null );
return found ? result : null;
}
+
+ /** apply an id generator to a SimpleValue */
+ public static void makeIdGenerator(
+ SimpleValue id, String generatorType, String generatorName, ExtendedMappings mappings,
+ Map<String, IdGenerator> localGenerators
+ ) {
+ Table table = id.getTable();
+ table.setIdentifierValue( id );
+ //generator settings
+ id.setIdentifierGeneratorStrategy( generatorType );
+ Properties params = new Properties();
+ //always settable
+ params.setProperty(
+ PersistentIdentifierGenerator.TABLE, table.getName()
+ );
+
+ if ( id.getColumnSpan() == 1 ) {
+ params.setProperty(
+ PersistentIdentifierGenerator.PK,
+ ( (org.hibernate.mapping.Column) id.getColumnIterator().next() ).getName()
+ );
+ }
+ if ( ! isDefault( generatorName ) ) {
+ //we have a named generator
+ IdGenerator gen = mappings.getGenerator( generatorName, localGenerators );
+ if ( gen == null ) {
+ throw new AnnotationException( "Unknown Id.generator: " + generatorName );
+ }
+ //This is quite vague in the spec but a generator could override the generate choice
+ String identifierGeneratorStrategy = gen.getIdentifierGeneratorStrategy();
+ //yuk! this is a hack not to override 'AUTO' even if generator is set
+ final boolean avoidOverriding =
+ identifierGeneratorStrategy.equals( "identity" )
+ || identifierGeneratorStrategy.equals( "seqhilo" )
+ || identifierGeneratorStrategy.equals( MultipleHiLoPerTableGenerator.class.getName() );
+ if ( generatorType == null || ! avoidOverriding ) {
+ id.setIdentifierGeneratorStrategy( identifierGeneratorStrategy );
+ }
+ //checkIfMatchingGenerator(gen, generatorType, generatorName);
+ Iterator genParams = gen.getParams().entrySet().iterator();
+ while ( genParams.hasNext() ) {
+ Map.Entry elt = (Map.Entry) genParams.next();
+ params.setProperty( (String) elt.getKey(), (String) elt.getValue() );
+ }
+ }
+ if ( generatorType == "assigned" ) id.setNullValue( "undefined" );
+ id.setIdentifierGeneratorProperties( params );
+ }
+
+ public static boolean isDefault(String annotationString) {
+ return ANNOTATION_STRING_DEFAULT.equals( annotationString );
+ }
}
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -51,12 +51,12 @@
}
else if ( discAnn != null ) {
discriminatorColumn.setImplicit( false );
- if ( ! AnnotationBinder.isDefault( discAnn.columnDefinition() ) ) {
+ if ( ! BinderHelper.isDefault( discAnn.columnDefinition() ) ) {
discriminatorColumn.setSqlType(
discAnn.columnDefinition()
);
}
- if ( ! AnnotationBinder.isDefault( discAnn.name() ) ) {
+ if ( ! BinderHelper.isDefault( discAnn.name() ) ) {
discriminatorColumn.setLogicalColumnName( discAnn.name() );
}
discriminatorColumn.setNullable( false );
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -61,7 +61,7 @@
//Due to @AnnotationOverride overriding rules, I don't want the constructor to be public
private Ejb3JoinColumn() {
- setMappedBy( AnnotationBinder.ANNOTATION_STRING_DEFAULT );
+ setMappedBy( BinderHelper.ANNOTATION_STRING_DEFAULT );
}
//Due to @AnnotationOverride overriding rules, I don't want the constructor to be public
@@ -148,7 +148,7 @@
ExtendedMappings mappings
) {
if ( ann != null ) {
- if ( AnnotationBinder.isDefault( mappedBy ) ) {
+ if ( BinderHelper.isDefault( mappedBy ) ) {
throw new AnnotationException(
"Illegal attempt to define a @JoinColumn with a mappedBy association: "
+ BinderHelper.getRelativePath( propertyHolder, propertyName )
@@ -185,8 +185,8 @@
}
else {
setImplicit( false );
- if ( ! AnnotationBinder.isDefault( annJoin.columnDefinition() ) ) setSqlType( annJoin.columnDefinition() );
- if ( ! AnnotationBinder.isDefault( annJoin.name() ) ) setLogicalColumnName( annJoin.name() );
+ if ( ! BinderHelper.isDefault( annJoin.columnDefinition() ) ) setSqlType( annJoin.columnDefinition() );
+ if ( ! BinderHelper.isDefault( annJoin.name() ) ) setLogicalColumnName( annJoin.name() );
setNullable( annJoin.nullable() );
setUnique( annJoin.unique() );
setInsertable( annJoin.insertable() );
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/IndexColumn.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/IndexColumn.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/IndexColumn.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -67,8 +67,8 @@
) {
IndexColumn column;
if ( ann != null ) {
- String sqlType = AnnotationBinder.isDefault( ann.columnDefinition() ) ? null : ann.columnDefinition();
- String name = AnnotationBinder.isDefault( ann.name() ) ? inferredData.getPropertyName() : ann.name();
+ String sqlType = BinderHelper.isDefault( ann.columnDefinition() ) ? null : ann.columnDefinition();
+ String name = BinderHelper.isDefault( ann.name() ) ? inferredData.getPropertyName() : ann.name();
//TODO move it to a getter based system and remove the constructor
column = new IndexColumn(
false, sqlType, 0, 0, 0, name, ann.nullable(),
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/OneToOneSecondPass.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/OneToOneSecondPass.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/OneToOneSecondPass.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -90,7 +90,7 @@
binder.setCascade( cascadeStrategy );
binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
Property prop = binder.make();
- if ( AnnotationBinder.isDefault( mappedBy ) ) {
+ if ( BinderHelper.isDefault( mappedBy ) ) {
/*
* we need to check if the columns are in the right order
* if not, then we need to create a many to one and formula
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -33,6 +33,7 @@
import org.hibernate.annotations.Sort;
import org.hibernate.annotations.SortType;
import org.hibernate.annotations.Where;
+import org.hibernate.annotations.CollectionId;
import org.hibernate.cfg.AnnotatedClassType;
import org.hibernate.cfg.AnnotationBinder;
import org.hibernate.cfg.BinderHelper;
@@ -58,6 +59,7 @@
import org.hibernate.mapping.Property;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;
+import org.hibernate.mapping.IdGenerator;
import org.hibernate.reflection.XAnnotatedElement;
import org.hibernate.reflection.XClass;
import org.hibernate.reflection.XProperty;
@@ -68,7 +70,7 @@
* Collection binder
*
* @author inger
- * @author emmanuel
+ * @author Emmanuel Bernard
*/
public abstract class CollectionBinder {
@@ -108,6 +110,7 @@
private TableBinder tableBinder;
private Ejb3Column[] mapKeyColumns;
private Ejb3JoinColumn[] mapKeyManyToManyColumns;
+ protected HashMap<String, IdGenerator> localGenerators;
public void setUpdatable(boolean updatable) {
this.updatable = updatable;
@@ -154,7 +157,7 @@
public void setSqlOrderBy(OrderBy orderByAnn) {
if ( orderByAnn != null ) {
- if ( ! AnnotationBinder.isDefault( orderByAnn.clause() ) ) orderBy = orderByAnn.clause();
+ if ( ! BinderHelper.isDefault( orderByAnn.clause() ) ) orderBy = orderByAnn.clause();
}
}
@@ -171,10 +174,9 @@
* collection binder factory
*/
public static CollectionBinder getCollectionBinder(
- String entityName, PropertyData inferredData,
+ String entityName, XProperty property,
boolean isIndexed
) {
- XProperty property = inferredData.getProperty();
if ( property.isArray() ) {
if ( property.getElementClass().isPrimitive() ) {
return new PrimitiveArrayBinder();
@@ -196,12 +198,20 @@
return new MapBinder();
}
else if ( java.util.Collection.class.equals( returnedClass ) ) {
- return new BagBinder();
+ if ( property.isAnnotationPresent( CollectionId.class ) ) {
+ return new IdBagBinder();
+ }
+ else {
+ return new BagBinder();
+ }
}
else if ( java.util.List.class.equals( returnedClass ) ) {
if ( isIndexed ) {
return new ListBinder();
}
+ else if ( property.isAnnotationPresent( CollectionId.class ) ) {
+ return new IdBagBinder();
+ }
else {
return new BagBinder();
}
@@ -321,7 +331,7 @@
Map.Entry<String, String> filter = iter.next();
String name = filter.getKey();
String cond = filter.getValue();
- if ( AnnotationBinder.isDefault( cond ) ) {
+ if ( BinderHelper.isDefault( cond ) ) {
cond = mappings.getFilterDefinition( name ).getDefaultFilterCondition();
if ( StringHelper.isEmpty( cond ) ) {
throw new AnnotationException(
@@ -334,7 +344,7 @@
}
//work on association
- boolean isMappedBy = ! AnnotationBinder.isDefault( mappedBy );
+ boolean isMappedBy = ! BinderHelper.isDefault( mappedBy );
collection.setInverse( isMappedBy );
String collType = getCollectionType().getName();
@@ -507,7 +517,7 @@
&& ! reversePropertyInJoin
&& oneToMany
&& ! this.isExplicitAssociationTable
- && ( joinColumns[0].isImplicit() && ! AnnotationBinder.isDefault( this.mappedBy ) //implicit @JoinColumn
+ && ( joinColumns[0].isImplicit() && ! BinderHelper.isDefault( this.mappedBy ) //implicit @JoinColumn
|| ! fkJoinColumns[0].isImplicit() ) //this is an explicit @JoinColumn
) {
//this is a Foreign key
@@ -598,7 +608,7 @@
public void setCache(Cache cacheAnn) {
if ( cacheAnn != null ) {
- cacheRegionName = AnnotationBinder.isDefault( cacheAnn.region() ) ? null : cacheAnn.region();
+ cacheRegionName = BinderHelper.isDefault( cacheAnn.region() ) ? null : cacheAnn.region();
cacheConcurrencyStrategy = EntityBinder.getCacheConcurrencyStrategy( cacheAnn.usage() );
}
else {
@@ -881,7 +891,7 @@
}
}
- boolean mappedBy = ! AnnotationBinder.isDefault( joinColumns[0].getMappedBy() );
+ boolean mappedBy = ! BinderHelper.isDefault( joinColumns[0].getMappedBy() );
if ( mappedBy ) {
if ( ! isCollectionOfEntities ) {
StringBuilder error = new StringBuilder( 80 )
@@ -1202,4 +1212,8 @@
public void setMapKeyManyToManyColumns(Ejb3JoinColumn[] mapJoinColumns) {
this.mapKeyManyToManyColumns = mapJoinColumns;
}
+
+ public void setLocalGenerators(HashMap<String, IdGenerator> localGenerators) {
+ this.localGenerators = localGenerators;
+ }
}
\ No newline at end of file
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -34,6 +34,7 @@
import org.hibernate.cfg.ExtendedMappings;
import org.hibernate.cfg.InheritanceState;
import org.hibernate.cfg.PropertyHolder;
+import org.hibernate.cfg.BinderHelper;
import org.hibernate.engine.Versioning;
import org.hibernate.mapping.DependantValue;
import org.hibernate.mapping.Join;
@@ -130,7 +131,7 @@
private void bindEjb3Annotation(Entity ejb3Ann) {
if ( ejb3Ann == null ) throw new AssertionFailure( "@Entity should always be not null" );
- if ( AnnotationBinder.isDefault( ejb3Ann.name() ) ) {
+ if ( BinderHelper.isDefault( ejb3Ann.name() ) ) {
name = StringHelper.unqualify( annotatedClass.getName() );
}
else {
@@ -174,7 +175,7 @@
}
persistentClass.setOptimisticLockMode( getVersioning( optimisticLockType ) );
persistentClass.setSelectBeforeUpdate( selectBeforeUpdate );
- if ( ! AnnotationBinder.isDefault( persister ) ) {
+ if ( ! BinderHelper.isDefault( persister ) ) {
try {
persistentClass.setEntityPersisterClass( ReflectHelper.classForName( persister ) );
}
@@ -190,7 +191,7 @@
Map.Entry<String, String> filter = iter.next();
String filterName = filter.getKey();
String cond = filter.getValue();
- if ( AnnotationBinder.isDefault( cond ) ) {
+ if ( BinderHelper.isDefault( cond ) ) {
cond = mappings.getFilterDefinition( filterName ).getDefaultFilterCondition();
if ( StringHelper.isEmpty( cond ) ) {
throw new AnnotationException(
@@ -538,7 +539,7 @@
public void setCache(Cache cacheAnn) {
if ( cacheAnn != null ) {
- cacheRegion = AnnotationBinder.isDefault( cacheAnn.region() ) ? null : cacheAnn.region();
+ cacheRegion = BinderHelper.isDefault( cacheAnn.region() ) ? null : cacheAnn.region();
cacheConcurrentStrategy = getCacheConcurrencyStrategy( cacheAnn.usage() );
if ( "all".equalsIgnoreCase( cacheAnn.include() ) ) {
cacheLazyProperty = true;
Added: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/IdBagBinder.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -0,0 +1,87 @@
+//$Id: $
+package org.hibernate.cfg.annotations;
+
+import java.util.Map;
+import java.util.Collections;
+
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.IdentifierCollection;
+import org.hibernate.mapping.Table;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.PropertyData;
+import org.hibernate.cfg.WrappedInferredData;
+import org.hibernate.cfg.PropertyInferredData;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.reflection.XProperty;
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.Type;
+import org.hibernate.AnnotationException;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdBagBinder extends BagBinder {
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new org.hibernate.mapping.IdentifierBag( persistentClass );
+ }
+
+ @Override
+ protected boolean bindStarToManySecondPass(
+ Map persistentClasses, String collType, Ejb3JoinColumn[] fkJoinColumns, Ejb3JoinColumn[] keyColumns,
+ Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns, boolean isEmbedded, XProperty property,
+ boolean unique, TableBinder associationTableBinder, boolean ignoreNotFound, ExtendedMappings mappings
+ ) {
+ boolean result = super.bindStarToManySecondPass(
+ persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns, isEmbedded,
+ property, unique, associationTableBinder, ignoreNotFound, mappings
+ );
+ CollectionId collectionIdAnn = property.getAnnotation( CollectionId.class );
+ if (collectionIdAnn != null) {
+ SimpleValueBinder simpleValue = new SimpleValueBinder();
+
+ PropertyData propertyData = new WrappedInferredData(
+ new PropertyInferredData(property, null), //default access should not be useful
+ "id" );
+ Ejb3Column[] idColumns = Ejb3Column.buildColumnFromAnnotation(
+ collectionIdAnn.columns(),
+ null,
+ Nullability.FORCED_NOT_NULL,
+ propertyHolder,
+ propertyData,
+ Collections.EMPTY_MAP,
+ mappings
+ );
+ Table table = collection.getCollectionTable();
+ simpleValue.setTable( table );
+ simpleValue.setColumns( idColumns );
+ Type typeAnn = collectionIdAnn.type();
+ if ( typeAnn != null && ! BinderHelper.isDefault( typeAnn.type() ) ) {
+ simpleValue.setExplicitType( typeAnn );
+ }
+ else {
+ throw new AnnotationException("@CollectionId is missing type: "
+ + StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
+ }
+ simpleValue.setMappings( mappings );
+ SimpleValue id = simpleValue.make();
+ ( (IdentifierCollection) collection ).setIdentifier( id );
+ String generator = collectionIdAnn.generator();
+ String generatorType;
+ if ( "identity".equals( generator ) || "assigned".equals( generator )
+ || "sequence".equals( generator ) || "native".equals( generator ) ) {
+ generatorType = generator;
+ generator = "";
+ }
+ else {
+ generatorType = null;
+ }
+ BinderHelper.makeIdGenerator( id, generatorType, generator, mappings, localGenerators);
+ }
+ return result;
+ }
+}
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/QueryBinder.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -19,7 +19,7 @@
import org.hibernate.LockMode;
import org.hibernate.annotations.CacheModeType;
import org.hibernate.annotations.FlushModeType;
-import org.hibernate.cfg.AnnotationBinder;
+import org.hibernate.cfg.BinderHelper;
import org.hibernate.cfg.ExtendedMappings;
import org.hibernate.cfg.NotYetImplementedException;
import org.hibernate.engine.NamedQueryDefinition;
@@ -37,7 +37,7 @@
public static void bindQuery(NamedQuery queryAnn, ExtendedMappings mappings, boolean isDefault) {
if ( queryAnn == null ) return;
- if ( AnnotationBinder.isDefault( queryAnn.name() ) ) {
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
throw new AnnotationException( "A named query must have a name when used in class or package level" );
}
//EJBQL Query
@@ -68,14 +68,14 @@
public static void bindNativeQuery(NamedNativeQuery queryAnn, ExtendedMappings mappings, boolean isDefault) {
if ( queryAnn == null ) return;
//ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() );
- if ( AnnotationBinder.isDefault( queryAnn.name() ) ) {
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
throw new AnnotationException( "A named query must have a name when used in class or package level" );
}
NamedSQLQueryDefinition query;
String resultSetMapping = queryAnn.resultSetMapping();
QueryHint[] hints = queryAnn.hints();
String queryName = queryAnn.query();
- if ( ! AnnotationBinder.isDefault( resultSetMapping ) ) {
+ if ( ! BinderHelper.isDefault( resultSetMapping ) ) {
//sql result set usage
query = new NamedSQLQueryDefinition(
queryName,
@@ -131,25 +131,25 @@
public static void bindNativeQuery(org.hibernate.annotations.NamedNativeQuery queryAnn, ExtendedMappings mappings) {
if ( queryAnn == null ) return;
//ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() );
- if ( AnnotationBinder.isDefault( queryAnn.name() ) ) {
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
throw new AnnotationException( "A named query must have a name when used in class or package level" );
}
NamedSQLQueryDefinition query;
String resultSetMapping = queryAnn.resultSetMapping();
- if ( ! AnnotationBinder.isDefault( resultSetMapping ) ) {
+ if ( ! BinderHelper.isDefault( resultSetMapping ) ) {
//sql result set usage
query = new NamedSQLQueryDefinition(
queryAnn.query(),
resultSetMapping,
null,
queryAnn.cacheable(),
- AnnotationBinder.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
+ BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
getFlushMode( queryAnn.flushMode() ),
getCacheMode( queryAnn.cacheMode() ),
queryAnn.readOnly(),
- AnnotationBinder.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
+ BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
null,
queryAnn.callable()
);
@@ -164,13 +164,13 @@
new NativeSQLQueryReturn[]{entityQueryReturn},
null,
queryAnn.cacheable(),
- AnnotationBinder.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
+ BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
getFlushMode( queryAnn.flushMode() ),
getCacheMode( queryAnn.cacheMode() ),
queryAnn.readOnly(),
- AnnotationBinder.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
+ BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
null,
queryAnn.callable()
);
@@ -209,7 +209,7 @@
public static void bindQuery(org.hibernate.annotations.NamedQuery queryAnn, ExtendedMappings mappings) {
if ( queryAnn == null ) return;
- if ( AnnotationBinder.isDefault( queryAnn.name() ) ) {
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
throw new AnnotationException( "A named query must have a name when used in class or package level" );
}
@@ -219,13 +219,13 @@
NamedQueryDefinition query = new NamedQueryDefinition(
queryAnn.query(),
queryAnn.cacheable(),
- AnnotationBinder.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
+ BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
flushMode,
getCacheMode( queryAnn.cacheMode() ),
queryAnn.readOnly(),
- AnnotationBinder.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
+ BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
null
);
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -17,7 +17,7 @@
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.hibernate.MappingException;
-import org.hibernate.cfg.AnnotationBinder;
+import org.hibernate.cfg.BinderHelper;
import org.hibernate.cfg.ExtendedMappings;
import org.hibernate.cfg.QuerySecondPass;
import org.hibernate.engine.ResultSetMappingDefinition;
@@ -136,7 +136,7 @@
}
}
- if ( ! AnnotationBinder.isDefault( entity.discriminatorColumn() ) ) {
+ if ( ! BinderHelper.isDefault( entity.discriminatorColumn() ) ) {
propertyresults.put( "class", new String[]{entity.discriminatorColumn()} );
}
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -16,7 +16,7 @@
import org.hibernate.AssertionFailure;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;
-import org.hibernate.cfg.AnnotationBinder;
+import org.hibernate.cfg.BinderHelper;
import org.hibernate.cfg.Ejb3Column;
import org.hibernate.cfg.ExtendedMappings;
import org.hibernate.cfg.NotYetImplementedException;
@@ -45,6 +45,7 @@
private String explicitType = "";
private Properties typeParameters = new Properties();
private ExtendedMappings mappings;
+ private Table table;
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
@@ -54,6 +55,10 @@
this.returnedClassName = returnedClassName;
}
+ public void setTable(Table table) {
+ this.table = table;
+ }
+
public void setColumns(Ejb3Column[] columns) {
this.columns = columns;
}
@@ -74,7 +79,7 @@
}
Properties typeParameters = this.typeParameters;
typeParameters.clear();
- String type = AnnotationBinder.ANNOTATION_STRING_DEFAULT;
+ String type = BinderHelper.ANNOTATION_STRING_DEFAULT;
if ( property.isAnnotationPresent( Temporal.class ) ) {
Temporal ann = property.getAnnotation( Temporal.class );
boolean isDate;
@@ -152,7 +157,7 @@
if ( columns == null ) {
throw new AssertionFailure( "SimpleValueBinder.setColumns should be set before SimpleValueBinder.setType" );
}
- if ( AnnotationBinder.ANNOTATION_STRING_DEFAULT.equals( type ) ) {
+ if ( BinderHelper.ANNOTATION_STRING_DEFAULT.equals( type ) ) {
if ( returnedClassOrElement.isEnum() ) {
type = EnumType.class.getName();
typeParameters = new Properties();
@@ -213,13 +218,15 @@
public SimpleValue make() {
validate();
log.debug( "building SimpleValue for " + propertyName );
- Table table = columns[0].getTable();
+ if (table == null) {
+ table = columns[0].getTable();
+ }
SimpleValue simpleValue = new SimpleValue( table );
return fillSimpleValue( simpleValue );
}
- private SimpleValue fillSimpleValue(SimpleValue simpleValue) {
- String type = AnnotationBinder.isDefault( explicitType ) ? returnedClassName : explicitType;
+ public SimpleValue fillSimpleValue(SimpleValue simpleValue) {
+ String type = BinderHelper.isDefault( explicitType ) ? returnedClassName : explicitType;
org.hibernate.mapping.TypeDef typeDef = mappings.getTypeDef( type );
if ( typeDef != null ) {
type = typeDef.getTypeClass();
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/TableBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/TableBinder.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/TableBinder.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -11,7 +11,7 @@
import org.hibernate.AnnotationException;
import org.hibernate.AssertionFailure;
import org.hibernate.annotations.Index;
-import org.hibernate.cfg.AnnotationBinder;
+import org.hibernate.cfg.BinderHelper;
import org.hibernate.cfg.Ejb3JoinColumn;
import org.hibernate.cfg.ExtendedMappings;
import org.hibernate.cfg.IndexSecondPass;
@@ -107,8 +107,8 @@
String schema, String catalog, String realTableName, String logicalName, boolean isAbstract,
List uniqueConstraints, String constraints, Table denormalizedSuperTable, ExtendedMappings mappings
) {
- schema = AnnotationBinder.isDefault( schema ) ? mappings.getSchemaName() : schema;
- catalog = AnnotationBinder.isDefault( catalog ) ? mappings.getCatalogName() : catalog;
+ schema = BinderHelper.isDefault( schema ) ? mappings.getSchemaName() : schema;
+ catalog = BinderHelper.isDefault( catalog ) ? mappings.getCatalogName() : catalog;
Table table;
if ( denormalizedSuperTable != null ) {
table = mappings.addDenormalizedTable(
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -353,6 +353,11 @@
getAssociation( OneToOne.class, annotationList, defaults );
getAssociation( OneToMany.class, annotationList, defaults );
getAssociation( ManyToMany.class, annotationList, defaults );
+ Annotation current = getSequenceGenerator( tree, defaults );
+ if ( current != null ) annotationList.add( current );
+ current = getTableGenerator( tree, defaults );
+ if ( current != null ) annotationList.add( current );
+
}
processEventAnnotations(annotationList, defaults);
this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -0,0 +1,45 @@
+//$Id: $
+package org.hibernate.test.annotations.identifiercollection;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdentifierCollectionTest extends TestCase {
+ public void testIdBag() throws Exception {
+ Passport passport = new Passport();
+ passport.setName( "Emmanuel Bernard" );
+ Stamp canada = new Stamp();
+ canada.setCountry( "Canada" );
+ passport.getStamps().add( canada );
+ passport.getVisaStamp().add( canada );
+ Stamp norway = new Stamp();
+ norway.setCountry( "Norway" );
+ passport.getStamps().add( norway );
+ passport.getStamps().add(canada);
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( passport );
+ s.flush();
+ //s.clear();
+ passport = (Passport) s.get( Passport.class, passport.getId() );
+ int canadaCount = 0;
+ for ( Stamp stamp : passport.getStamps() ) {
+ if ( "Canada".equals( stamp.getCountry() ) ) canadaCount++;
+ }
+ assertEquals( 2, canadaCount );
+ assertEquals( 1, passport.getVisaStamp().size() );
+ tx.rollback();
+ s.close();
+ }
+ protected Class[] getMappings() {
+ return new Class[] {
+ Passport.class,
+ Stamp.class
+ };
+ }
+}
Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -0,0 +1,70 @@
+//$Id: $
+package org.hibernate.test.annotations.identifiercollection;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+@TableGenerator(name="ids_generator", table="IDS")
+public class Passport {
+ @Id @GeneratedValue @Column(name="passport_id") private Long id;
+ private String name;
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @JoinTable(name="PASSPORT_STAMP")
+ @CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "generator")
+ @TableGenerator(name="generator", table="IDSTAMP")
+ private Collection<Stamp> stamps = new ArrayList();
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @JoinTable(name="PASSPORT_VISASTAMP")
+ @CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "ids_generator")
+ //TODO test identity generator
+ private Collection<Stamp> visaStamp = new ArrayList();
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Collection<Stamp> getStamps() {
+ return stamps;
+ }
+
+ public void setStamps(Collection<Stamp> stamps) {
+ this.stamps = stamps;
+ }
+
+ public Collection<Stamp> getVisaStamp() {
+ return visaStamp;
+ }
+
+ public void setVisaStamp(Collection<Stamp> visaStamp) {
+ this.visaStamp = visaStamp;
+ }
+}
Added: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java 2006-08-11 19:44:32 UTC (rev 10252)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java 2006-08-14 00:19:48 UTC (rev 10253)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.test.annotations.identifiercollection;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+public class Stamp {
+ @Id @GeneratedValue private Long id;
+ private String country;
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
17 years, 9 months
Mail list migration complete
by Steve Ebersole
Migration of the Hibernate email lists to their new hosting home is now
complete. As of today, automated emails have been fully cut over:
JIRA -> hibernate-issues(a)lists.jboss.org
SVN -> hibernate-commits(a)lists.jboss.org
CruiseControl -> hibernate-dev(a)lists.jboss.org
For the past 2 weeks or so I have been monitoring both of the dev lists.
As of next week, that will stop and I will only continue to subscribe to
hibernate-dev(a)lists.jboss.org
The hibernate-announce(a)lists.jboss.org is new and we'll see how it goes.
It is supposed to be used for general announcements, release
notifications, etc. For example, I intend to send release announcements
to both hibernate-announce(a)lists.jboss.org and
hibernate-dev@lists.jboss.org...
Thanks!
Steve
17 years, 9 months
Hibernate SVN: r10252 - branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2006-08-11 15:44:32 -0400 (Fri, 11 Aug 2006)
New Revision: 10252
Modified:
branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java
Log:
utilize combined trim emulation function template from sqlserver dialect
Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java
===================================================================
--- branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java 2006-08-11 19:41:36 UTC (rev 10251)
+++ branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/SQLServerDialect.java 2006-08-11 19:44:32 UTC (rev 10252)
@@ -2,18 +2,12 @@
package org.hibernate.dialect;
import java.sql.Types;
-import java.util.List;
-import java.util.ArrayList;
import org.hibernate.Hibernate;
import org.hibernate.LockMode;
-import org.hibernate.QueryException;
-import org.hibernate.engine.Mapping;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.type.Type;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.dialect.function.StandardSQLFunction;
-import org.hibernate.dialect.function.SQLFunction;
+import org.hibernate.dialect.function.AnsiTrimEmulationFunction;
/**
* A dialect for Microsoft SQL Server 2000
@@ -31,10 +25,11 @@
registerFunction( "locate", new StandardSQLFunction("charindex", Hibernate.INTEGER) );
registerFunction( "extract", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(?1, ?3)" ) );
- registerFunction( "trim", new TrimFunction() );
registerFunction( "mod", new SQLFunctionTemplate( Hibernate.INTEGER, "?1 % ?2" ) );
registerFunction( "bit_length", new SQLFunctionTemplate( Hibernate.INTEGER, "datalength(?1) * 8" ) );
+ registerFunction( "trim", new AnsiTrimEmulationFunction() );
+
registerKeyword("top");
}
@@ -108,134 +103,4 @@
public String getCurrentTimestampSelectString() {
return "select current_timestamp";
}
-
- /**
- * A SQLServer-specific version of the ANSI-SQL trim function as SQLServer
- * does not support such a thing.
- */
- public static class TrimFunction implements SQLFunction {
- private static final SQLFunction LEADING_SPACE_TRIM = new SQLFunctionTemplate( Hibernate.STRING, "ltrim( ?1 )");
- private static final SQLFunction TRAILING_SPACE_TRIM = new SQLFunctionTemplate( Hibernate.STRING, "rtrim( ?1 )");
- private static final SQLFunction BOTH_SPACE_TRIM = new SQLFunctionTemplate( Hibernate.STRING, "ltrim( rtrim( ?1 ) )");
- private static final SQLFunction BOTH_SPACE_TRIM_FROM = new SQLFunctionTemplate( Hibernate.STRING, "ltrim( rtrim( ?2 ) )");
-
- private static final SQLFunction LEADING_TRIM = new SQLFunctionTemplate( Hibernate.STRING, "replace( replace( rtrim( replace( replace( ?1, ' ', '${space}$' ), ?2, ' ' ) ), ' ', ?2 ), '${space}$', ' ' )" );
- private static final SQLFunction TRAILING_TRIM = new SQLFunctionTemplate( Hibernate.STRING, "replace( replace( ltrim( replace( replace( ?1, ' ', '${space}$' ), ?2, ' ' ) ), ' ', ?2 ), '${space}$', ' ' )" );
- private static final SQLFunction BOTH_TRIM = new SQLFunctionTemplate( Hibernate.STRING, "replace( replace( ltrim( rtrim( replace( replace( ?1, ' ', '${space}$' ), ?2, ' ' ) ) ), ' ', ?2 ), '${space}$', ' ' )" );
-
- public Type getReturnType(Type columnType, Mapping mapping) throws QueryException {
- return Hibernate.STRING;
- }
-
- public boolean hasArguments() {
- return true;
- }
-
- public boolean hasParenthesesIfNoArguments() {
- return false;
- }
-
- public String render(List args, SessionFactoryImplementor factory) throws QueryException {
- // according to both the ANSI-SQL and EJB3 specs, trim can either take
- // exactly one parameter or a variable number of parameters between 1 and 4.
- // from the SQL spec:
- //
- // <trim function> ::=
- // TRIM <left paren> <trim operands> <right paren>
- //
- // <trim operands> ::=
- // [ [ <trim specification> ] [ <trim character> ] FROM ] <trim source>
- //
- // <trim specification> ::=
- // LEADING
- // | TRAILING
- // | BOTH
- //
- // If only <trim specification> is omitted, BOTH is assumed;
- // if <trim character> is omitted, space is assumed
- if ( args.size() == 1 ) {
- // we have the form: trim(trimSource)
- // so we trim leading and trailing spaces
- return BOTH_SPACE_TRIM.render( args, factory );
- }
- else if ( "from".equalsIgnoreCase( ( String ) args.get( 0 ) ) ) {
- // we have the form: trim(from trimSource).
- // This is functionally equivalent to trim(trimSource)
- return BOTH_SPACE_TRIM_FROM.render( args, factory );
- }
- else {
- // otherwise, a trim-specification and/or a trim-character
- // have been specified; we need to decide which options
- // are present and "do the right thing"
- boolean leading = true; // should leading trim-characters be trimmed?
- boolean trailing = true; // should trailing trim-characters be trimmed?
- String trimCharacter = null; // the trim-character
- String trimSource = null; // the trim-source
-
- // potentialTrimCharacterArgIndex = 1 assumes that a
- // trim-specification has been specified. we handle the
- // exception to that explicitly
- int potentialTrimCharacterArgIndex = 1;
- String firstArg = ( String ) args.get( 0 );
- if ( "leading".equalsIgnoreCase( firstArg ) ) {
- trailing = false;
- }
- else if ( "trailing".equalsIgnoreCase( firstArg ) ) {
- leading = false;
- }
- else if ( "both".equalsIgnoreCase( firstArg ) ) {
- }
- else {
- potentialTrimCharacterArgIndex = 0;
- }
-
- String potentialTrimCharacter = ( String ) args.get( potentialTrimCharacterArgIndex );
- if ( "from".equalsIgnoreCase( potentialTrimCharacter ) ) {
- trimCharacter = "' '";
- trimSource = ( String ) args.get( potentialTrimCharacterArgIndex + 1 );
- }
- else if ( potentialTrimCharacterArgIndex + 1 >= args.size() ) {
- trimCharacter = "' '";
- trimSource = potentialTrimCharacter;
- }
- else {
- trimCharacter = potentialTrimCharacter;
- if ( "from".equalsIgnoreCase( ( String ) args.get( potentialTrimCharacterArgIndex + 1 ) ) ) {
- trimSource = ( String ) args.get( potentialTrimCharacterArgIndex + 2 );
- }
- else {
- trimSource = ( String ) args.get( potentialTrimCharacterArgIndex + 1 );
- }
- }
-
- List argsToUse = null;
- argsToUse = new ArrayList();
- argsToUse.add( trimSource );
- argsToUse.add( trimCharacter );
-
- if ( trimCharacter.equals( "' '" ) ) {
- if ( leading && trailing ) {
- return BOTH_SPACE_TRIM.render( argsToUse, factory );
- }
- else if ( leading ) {
- return LEADING_SPACE_TRIM.render( argsToUse, factory );
- }
- else {
- return TRAILING_SPACE_TRIM.render( argsToUse, factory );
- }
- }
- else {
- if ( leading && trailing ) {
- return BOTH_TRIM.render( argsToUse, factory );
- }
- else if ( leading ) {
- return LEADING_TRIM.render( argsToUse, factory );
- }
- else {
- return TRAILING_TRIM.render( argsToUse, factory );
- }
- }
- }
- }
- }
}
17 years, 9 months