HHH-5578 Support SpecJ's proprietary syntax

Generalize the fix a bit
Clean some more style issues
Fix issues related to the atomicity test
  fixed setting proper value on property marked as many-to-one-key
  fixed parsing bug, now it shouldnt affect other many-to-one in the same entity
  fixed annotation check on many-to-one property

git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@20767 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
Emmanuel Bernard 2010-10-04 09:45:09 +00:00
parent 3684576124
commit 3b3c8bc923
4 changed files with 46 additions and 20 deletions

View File

@ -1417,7 +1417,6 @@ public final class AnnotationBinder {
* TODO support true/false/default on the property instead of present / not present
* TODO is @Column mandatory?
* TODO add method support
* TODO avoid custId hardcoded
*/
if ( System.getProperty( "hibernate.enable_specj_proprietary_syntax" ) != null ) {
if ( element.isAnnotationPresent( Id.class ) && element.isAnnotationPresent( Column.class ) ) {
@ -1433,7 +1432,7 @@ public final class AnnotationBinder {
propertyAccessor, //TODO we should get the right accessor but the same as id would do
mappings.getReflectionManager()
);
mappings.addPropertyAnnotatedWithMapsIdSpecj( entity, specJPropertyData, "custId" );
mappings.addPropertyAnnotatedWithMapsIdSpecj( entity, specJPropertyData, element.toString() );
}
}
}
@ -2650,7 +2649,8 @@ public final class AnnotationBinder {
}
}
//Make sure that JPA1 key-many-to-one columns are read only too
//Make sure that JPA1 key-many-to-one columns are read only tooj
boolean hasSpecjManyToOne=false;
if ( System.getProperty( "hibernate.enable_specj_proprietary_syntax" ) != null ) {
String columnName = "";
for ( XProperty prop : inferredData.getDeclaringClass()
@ -2659,13 +2659,12 @@ public final class AnnotationBinder {
columnName = prop.getAnnotation( Column.class ).name();
}
final JoinColumn joinColumn = prop.getAnnotation( JoinColumn.class );
if ( prop.isAnnotationPresent( ManyToOne.class ) && joinColumn != null
final JoinColumn joinColumn = property.getAnnotation( JoinColumn.class );
if ( property.isAnnotationPresent( ManyToOne.class ) && joinColumn != null
&& !joinColumn.name().isEmpty()
&& joinColumn.name().equals( columnName )
&& !prop.isAnnotationPresent( MapsId.class ) )
{
&& !property.isAnnotationPresent( MapsId.class ) ) {
hasSpecjManyToOne = true;
for ( Ejb3JoinColumn column : columns ) {
column.setInsertable( false );
column.setUpdatable( false );
@ -2710,6 +2709,10 @@ public final class AnnotationBinder {
propertyBinder.setInsertable( false );
propertyBinder.setUpdatable( false );
}
else if (hasSpecjManyToOne) {
propertyBinder.setInsertable( false );
propertyBinder.setUpdatable( false );
}
else {
propertyBinder.setInsertable( columns[0].isInsertable() );
propertyBinder.setUpdatable( columns[0].isUpdatable() );

View File

@ -681,7 +681,14 @@ public class BinderHelper {
throw new AssertionFailure( "PersistentClass name cannot be converted into a Class", e);
}
if ( propertyHolder.isInIdClass() ) {
return mappings.getPropertyAnnotatedWithIdAndToOne( persistentXClass, propertyName );
PropertyData pd = mappings.getPropertyAnnotatedWithIdAndToOne( persistentXClass, propertyName );
if ( pd == null ) {
String propertyPath = isId ? "" : propertyName;
return mappings.getPropertyAnnotatedWithMapsId( persistentXClass, propertyPath );
}
else {
return pd;
}
}
else {
String propertyPath = isId ? "" : propertyName;

View File

@ -43,6 +43,7 @@ public class IdMapManyToOneSpecjTest extends TestCase {
public void testComplexIdClass() {
Session s = openSession();
Transaction tx = s.beginTransaction();
@ -79,16 +80,17 @@ public class IdMapManyToOneSpecjTest extends TestCase {
c1.addInventory( house, 100, new BigDecimal( 50000 ) );
s.merge( c1 );
s.flush();
s.clear();
tx.commit();
tx = s.beginTransaction();
Customer c12 = ( Customer ) s.createQuery( "select c from Customer c" ).uniqueResult();
// c12.getBalance();
List<CustomerInventory> inventory = c12.getInventories();
assertEquals( 2, inventory.size() );
assertEquals( 10, inventory.get( 0 ).getQuantity() );
assertEquals( "2", inventory.get(1).getVehicle().getId());
Item house2 = new Item();
@ -112,6 +114,20 @@ public class IdMapManyToOneSpecjTest extends TestCase {
.uniqueResult();
assertEquals( 3, c13.getInventories().size() );
Customer customer2 = new Customer(
"foo2", "bar2", "contact12", "1002", new BigDecimal( 10002 ), new BigDecimal( 10002 ), new BigDecimal( 1000 ));
customer2.setId(2);
s.persist(customer2);
customer2.addInventory(boat, 10, new BigDecimal(400));
customer2.addInventory(house2, 3, new BigDecimal(4000));
s.merge(customer2);
Customer c23 = ( Customer ) s.createQuery( "select c from Customer c where c.id = 2" ).uniqueResult();
assertEquals( 2, c23.getInventories().size() );
tx.rollback();
s.close();
}