Author: epbernard
Date: 2010-01-27 13:46:51 -0500 (Wed, 27 Jan 2010)
New Revision: 18655
Added:
core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java
Log:
HHH-4849 honor default join column names for @MapsId properties
Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java 2010-01-27
18:23:11 UTC (rev 18654)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -1758,6 +1758,12 @@
propertyBinder.setLazy( lazy );
propertyBinder.setColumns( columns );
+ if (isOverridden) {
+ final PropertyData mapsIdProperty = BinderHelper.getPropertyAnnotatedWithMapsId(
+ isId, propertyHolder, property.getName(), mappings
+ );
+ propertyBinder.setReferencedEntityName( mapsIdProperty.getClassOrElementName() );
+ }
propertyBinder.makePropertyValueAndBind();
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java 2010-01-27
18:23:11 UTC (rev 18654)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationConfiguration.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -365,6 +365,7 @@
caches.clear();
try {
inSecondPass = true;
+ processSecondPassesOfType( PkDrivenByDefaultMapsIdSecondPass.class );
processSecondPassesOfType( SetSimpleValueTypeSecondPass.class );
processSecondPassesOfType( CopyIdentifierComponentSecondPass.class );
processFkSecondPassInOrder();
Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java 2010-01-27
18:23:11 UTC (rev 18654)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/ColumnsBuilder.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -189,9 +189,9 @@
if ( annotatedWithMapsId != null ) {
result = buildExplicitJoinColumns( annotatedWithMapsId.getProperty(),
annotatedWithMapsId );
if (result == null) {
- //result = buildDefaultJoinColumnsForXToOne( annotatedWithMapsId.getProperty(),
annotatedWithMapsId);
- throw new UnsupportedOperationException( "Implicit @JoinColumn is not supported
on @MapsId properties: "
- + annotatedWithMapsId.getDeclaringClass() + " " +
annotatedWithMapsId.getPropertyName() );
+ result = buildDefaultJoinColumnsForXToOne( annotatedWithMapsId.getProperty(),
annotatedWithMapsId);
+// throw new UnsupportedOperationException( "Implicit @JoinColumn is not
supported on @MapsId properties: "
+// + annotatedWithMapsId.getDeclaringClass() + " " +
annotatedWithMapsId.getPropertyName() );
}
}
return result;
Added:
core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java
(rev 0)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/PkDrivenByDefaultMapsIdSecondPass.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -0,0 +1,38 @@
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.MappingException;
+import org.hibernate.cfg.annotations.TableBinder;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PkDrivenByDefaultMapsIdSecondPass implements SecondPass {
+ private final String referencedEntityName;
+ private final Ejb3JoinColumn[] columns;
+ private final SimpleValue value;
+
+ public PkDrivenByDefaultMapsIdSecondPass(String referencedEntityName, Ejb3JoinColumn[]
columns, SimpleValue value) {
+ this.referencedEntityName = referencedEntityName;
+ this.columns = columns;
+ this.value = value;
+ }
+
+ public void doSecondPass(Map persistentClasses) throws MappingException {
+ PersistentClass referencedEntity = (PersistentClass) persistentClasses.get(
referencedEntityName );
+ if ( referencedEntity == null ) {
+ throw new AnnotationException(
+ "Unknown entity name: " + referencedEntityName
+ );
+ };
+ TableBinder.linkJoinColumnWithValueOverridingNameIfImplicit(
+ referencedEntity,
+ referencedEntity.getKey().getColumnIterator(),
+ columns,
+ value);
+ }
+}
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java 2010-01-27
18:23:11 UTC (rev 18654)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/PropertyBinder.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -78,7 +78,12 @@
private boolean embedded;
private EntityBinder entityBinder;
private boolean isXToMany;
+ private String referencedEntityName;
+ public void setReferencedEntityName(String referencedEntityName) {
+ this.referencedEntityName = referencedEntityName;
+ }
+
public void setEmbedded(boolean embedded) {
this.embedded = embedded;
}
@@ -179,6 +184,7 @@
simpleValueBinder.setPersistentClassName( containerClassName );
simpleValueBinder.setType( property, returnedClass );
simpleValueBinder.setMappings( mappings );
+ simpleValueBinder.setReferencedEntityName( referencedEntityName );
SimpleValue propertyValue = simpleValueBinder.make();
setValue( propertyValue );
return makeProperty();
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2010-01-27
18:23:11 UTC (rev 18654)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -45,8 +45,10 @@
import org.hibernate.annotations.common.reflection.XProperty;
import org.hibernate.cfg.BinderHelper;
import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.Ejb3JoinColumn;
import org.hibernate.cfg.ExtendedMappings;
import org.hibernate.cfg.NotYetImplementedException;
+import org.hibernate.cfg.PkDrivenByDefaultMapsIdSecondPass;
import org.hibernate.cfg.SecondPass;
import org.hibernate.cfg.SetSimpleValueTypeSecondPass;
import org.hibernate.mapping.SimpleValue;
@@ -77,7 +79,12 @@
private boolean isVersion;
//is a Map key
private boolean key;
+ private String referencedEntityName;
+ public void setReferencedEntityName(String referencedEntityName) {
+ this.referencedEntityName = referencedEntityName;
+ }
+
public boolean isVersion() {
return isVersion;
}
@@ -307,9 +314,16 @@
}
public void linkWithValue() {
- for ( Ejb3Column column : columns) {
- column.linkWithValue( simpleValue );
+ if ( columns[0].isNameDeferred() && ! mappings.isInSecondPass() &&
referencedEntityName != null) {
+ mappings.addSecondPass(
+ new PkDrivenByDefaultMapsIdSecondPass( referencedEntityName, ( Ejb3JoinColumn[])
columns, simpleValue)
+ );
}
+ else {
+ for ( Ejb3Column column : columns) {
+ column.linkWithValue( simpleValue );
+ }
+ }
}
public void fillSimpleValue() {
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java
===================================================================
---
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java 2010-01-27
18:23:11 UTC (rev 18654)
+++
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/TableBinder.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -474,7 +474,7 @@
}
}
- private static void linkJoinColumnWithValueOverridingNameIfImplicit(
+ public static void linkJoinColumnWithValueOverridingNameIfImplicit(
PersistentClass referencedEntity, Iterator columnIterator, Ejb3JoinColumn[] columns,
SimpleValue value
) {
for (Ejb3JoinColumn joinCol : columns) {
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java 2010-01-27
18:23:11 UTC (rev 18654)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/Dependent.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -14,7 +14,7 @@
@EmbeddedId
DependentId id;
- @JoinColumn(name="FK") // id attribute mapped by join column default
+ //@JoinColumn(name="FK") // id attribute mapped by join column default
@MapsId("empPK") // maps empPK attribute of embedded id
@ManyToOne
Employee emp;
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java 2010-01-27
18:23:11 UTC (rev 18654)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/derivedidentities/e1/b/DerivedIdentitySimpleParentEmbeddedIdDepTest.java 2010-01-27
18:46:51 UTC (rev 18655)
@@ -11,19 +11,19 @@
DerivedIdentitySimpleParentEmbeddedIdDepTest extends TestCase {
public void testManyToOne() throws Exception {
- assertTrue( SchemaUtil.isColumnPresent( "Dependent", "FK", getCfg()
) );
+ assertTrue( SchemaUtil.isColumnPresent( "Dependent", "emp_empId",
getCfg() ) );
assertTrue( ! SchemaUtil.isColumnPresent( "Dependent", "empPK",
getCfg() ) );
Employee e = new Employee();
e.empId = 1;
e.empName = "Emmanuel";
Session s = openSession( );
s.getTransaction().begin();
- s.persist( e );
+
Dependent d = new Dependent();
d.emp = e;
d.id = new DependentId();
d.id.name = "Doggy";
- //d.id.empPK = e.empId; //FIXME not needed when foreign is enabled
+ s.persist( e );
s.persist( d );
s.flush();
s.clear();