[hibernate-commits] Hibernate SVN: r18393 - in core/trunk/annotations/src: main/java/org/hibernate/cfg/annotations and 1 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Mon Jan 4 11:47:09 EST 2010
Author: epbernard
Date: 2010-01-04 11:47:08 -0500 (Mon, 04 Jan 2010)
New Revision: 18393
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/Address.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/AttributeOverrideTest.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyInfo.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyRecord.java
Modified:
core/trunk/annotations/src/main/java/org/hibernate/cfg/AbstractPropertyHolder.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java
core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/MapBinder.java
Log:
HHH-4352 support for key. and value. for Map and @AttributeOverride. Managed to keep support for legacy names as well.
Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/AbstractPropertyHolder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/AbstractPropertyHolder.java 2010-01-04 16:03:21 UTC (rev 18392)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/AbstractPropertyHolder.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -98,8 +98,48 @@
/**
* Get column overriding, property first, then parent, then holder
+ * replace
+ * - "index" by "key" if present
+ * - "element" by "value" if present
+ * These rules are here to support both JPA 2 and legacy overriding rules.
+ *
+ * WARNING: this can conflict with user's expectations if:
+ * - the property uses some restricted values
+ * - the user has overridden the column
+ * But this is unlikely and avoid the need for a "legacy" flag
*/
public Column[] getOverriddenColumn(String propertyName) {
+ Column[] result = getExactOverriddenColumn( propertyName );
+ if (result == null) {
+ if ( propertyName.contains( ".key." ) ) {
+ //TODO cache the underlying regexp
+ result = getExactOverriddenColumn( propertyName.replace( ".key.", ".index." ) );
+ }
+ if ( result == null && propertyName.endsWith( ".key" ) ) {
+ //TODO cache the underlying regexp
+ result = getExactOverriddenColumn(
+ propertyName.substring( 0, propertyName.length() - ".key".length() ) + ".index"
+ );
+ }
+ if ( result == null && propertyName.contains( ".value." ) ) {
+ //TODO cache the underlying regexp
+ result = getExactOverriddenColumn( propertyName.replace( ".value.", ".element." ) );
+ }
+ if ( result == null && propertyName.endsWith( ".value" ) ) {
+ //TODO cache the underlying regexp
+ result = getExactOverriddenColumn(
+ propertyName.substring( 0, propertyName.length() - ".value".length() ) + ".element"
+ );
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Get column overriding, property first, then parent, then holder
+ * find the overridden rules from the exact property name.
+ */
+ private Column[] getExactOverriddenColumn(String propertyName) {
Column[] override = null;
if ( parent != null ) {
override = parent.getOverriddenColumn( propertyName );
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-04 16:03:21 UTC (rev 18392)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/AnnotationBinder.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -1672,6 +1672,7 @@
//nullify empty array
keyColumns = keyColumns != null && keyColumns.length > 0 ? keyColumns : null;
+ //"mapkey" is the legacy column name of the key column pre JPA 2
PropertyData mapKeyVirtualProperty = new WrappedInferredData( inferredData, "mapkey" );
Ejb3Column[] mapColumns = Ejb3Column.buildColumnFromAnnotation(
keyColumns,
Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java 2010-01-04 16:03:21 UTC (rev 18392)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/CollectionBinder.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -1295,7 +1295,8 @@
throw new AssertionFailure( "Unable to guess collection property accessor name" );
}
- PropertyData inferredData = new PropertyPreloadedData( AccessType.PROPERTY, "element", elementClass );
+ //"value" is the JPA 2 prefix for map values (used to be "element")
+ PropertyData inferredData = new PropertyPreloadedData( AccessType.PROPERTY, "value", elementClass );
//TODO be smart with isNullable
Component component = AnnotationBinder.fillComponent(
holder, inferredData, isPropertyAnnotated ? AccessType.PROPERTY : AccessType.FIELD, true,
Modified: core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/MapBinder.java
===================================================================
--- core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/MapBinder.java 2010-01-04 16:03:21 UTC (rev 18392)
+++ core/trunk/annotations/src/main/java/org/hibernate/cfg/annotations/MapBinder.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -174,10 +174,6 @@
else {
XClass elementClass;
AnnotatedClassType classType;
- // Map<String, javax.persistence.Column[]> columnOverrides = PropertyHolderBuilder.buildColumnOverride(
- // property, StringHelper.qualify( collValue.getRole(), "element" )
- // );
- //FIXME the "element" is lost
PropertyHolder holder = null;
if ( BinderHelper.PRIMITIVE_NAMES.contains( mapKeyType ) ) {
classType = AnnotatedClassType.NONE;
@@ -227,8 +223,8 @@
}
//boolean propertyAccess = embeddable == null || AccessType.PROPERTY.equals( embeddable.access() );
- //FIXME "index" is it right?
- PropertyData inferredData = new PropertyPreloadedData( AccessType.PROPERTY, "index", elementClass );
+ //"key" is the JPA 2 prefix for map keys
+ PropertyData inferredData = new PropertyPreloadedData( AccessType.PROPERTY, "key", elementClass );
//TODO be smart with isNullable
Component component = AnnotationBinder.fillComponent(
holder, inferredData, isPropertyAnnotated ? AccessType.PROPERTY : AccessType.FIELD, true,
Added: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/Address.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/Address.java (rev 0)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/Address.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -0,0 +1,14 @@
+package org.hibernate.test.annotations.override;
+
+import javax.persistence.Embedded;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Address {
+ public String street;
+ public String city;
+ public String state;
+}
Added: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/AttributeOverrideTest.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/AttributeOverrideTest.java (rev 0)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/AttributeOverrideTest.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -0,0 +1,46 @@
+package org.hibernate.test.annotations.override;
+
+import java.util.Iterator;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.metadata.CollectionMetadata;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.persister.collection.CollectionPersister;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AttributeOverrideTest extends TestCase {
+ public void testMapKeyValue() throws Exception {
+ assertTrue( isColumnPresent( "PropertyRecord_parcels", "ASSESSMENT") );
+ assertTrue( isColumnPresent( "PropertyRecord_parcels", "SQUARE_FEET") );
+ assertTrue( isColumnPresent( "PropertyRecord_parcels", "STREET_NAME") );
+ }
+
+ public boolean isColumnPresent(String tableName, String columnName) {
+ final Iterator<Table> tables = ( Iterator<Table> ) getCfg().getTableMappings();
+ while (tables.hasNext()) {
+ Table table = tables.next();
+ if (tableName.equals( table.getName() ) ) {
+ Iterator<Column> columns = (Iterator<Column>) table.getColumnIterator();
+ while ( columns.hasNext() ) {
+ Column column = columns.next();
+ if ( columnName.equals( column.getName() ) ) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ protected Class<?>[] getMappings() {
+ return new Class<?>[] {
+ PropertyInfo.class,
+ PropertyRecord.class,
+ Address.class
+ };
+ }
+}
Added: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyInfo.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyInfo.java (rev 0)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyInfo.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -0,0 +1,14 @@
+package org.hibernate.test.annotations.override;
+
+import java.math.BigDecimal;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class PropertyInfo {
+ public Integer parcelNumber;
+ public Integer size;
+ public BigDecimal tax;
+}
Added: core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyRecord.java
===================================================================
--- core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyRecord.java (rev 0)
+++ core/trunk/annotations/src/test/java/org/hibernate/test/annotations/override/PropertyRecord.java 2010-01-04 16:47:08 UTC (rev 18393)
@@ -0,0 +1,28 @@
+package org.hibernate.test.annotations.override;
+
+import java.util.Map;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.ElementCollection;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PropertyRecord {
+ @Id
+ @GeneratedValue
+ public Long id;
+
+ @AttributeOverrides({
+ @AttributeOverride(name = "key.street", column = @Column(name = "STREET_NAME")),
+ @AttributeOverride(name = "value.size", column = @Column(name = "SQUARE_FEET")),
+ @AttributeOverride(name = "value.tax", column = @Column(name = "ASSESSMENT"))
+ })
+ @ElementCollection
+ public Map<Address, PropertyInfo> parcels;
+}
\ No newline at end of file
More information about the hibernate-commits
mailing list